【C/C++学院】(25)Oracle数据库编程--proc编程

一、oracle中事务的概念

在oracle当中,所有对表的修改,都是在一个事务当中(事务就像一个内存的buffer一样)

提交事务的语句

commit;

放弃事务

rollback;

原则:

oracle所有对表的修改都是在事务当中,并不会直接修改到表。只有执行了commit或者rollback再生效或者放弃

对于SQL语言来讲,所有语法格式都是标准的,大多数的关键字也是通用的,但每一种数据库系统还是做了很多

扩展,所以SQL语言并不是100%通用的。

学习oracle开发的重点是学习如何在C/C++语言当中调用oracle的相关功能,实现对数据库的增删,改查。

二、嵌入式SQL语句

2.1 在PROC当中,所有嵌入式SQL当中用到的变量,必须在EXEC SQL BEGIN DECLARE SECTION;

与EXEC SQL END DECLARE SECTION;之间声明。

EXEC SQL BEGIN DECLARE SECTION;

sql_context pContext;

long SQLCODE;//变量类型和名称都不可以改变

EXEC SQL END DECLARE SECTION;

如果proc编译的时候添加THREADS=YES(在Makefile文件中),那么在pc文件当中必须先执行

ENABLE THREADS语句

EXEC SQL ENABLE THREADS

2.2       初始化oracle的嵌入式语句

EXEC SQL CONTEXT ALLOCATE :pContext;//为pContext分配内存

EXEC SQL CONTEXT USE :pContext;//使用pContext

2.3       连接到orcle的嵌入式SQL

EXEC SQL CONNECT :sUser IDENTIFIED BY :sPasswd USING :sDBname;

sUser为输入变量,代表连接数据库用户名

sPasswd为输入变量,代表连接数据库密码

sDBName为输入变量,代表数据库名称

2.4       断开连接的嵌入式SQL

EXEC SQL ROLLBACK WORK RELEASE;//断开连接,并且放弃未保存的事务

EXEC SQL COMMIT WORK RELEASE;//断开连接,并且提交未保存的事务

2.5       释放相关资源的嵌入式SQL

EXEC SQL CONTEXT FREE :pContext;

2.6       提交事务嵌入式SQL

EXEC SQL COMMIT WORK;

2.7       回滚事务嵌入式SQL

EXEC SQL ROLLBACK WORK;

2.8       动态SQL1

strcpy(SQL, "insert into table1 (id, name) values (0, ‘tom’)");

EXEC SQL EXECUTE IMMEDIATE :SQL;//执行SQL语句

2.9       动态SQL2

strcpy(SQL, "insert into table1 (id, name) values (:id, :name)");

在SQL语言中通过冒号指定占位符,占位符对应的值通过如下代码赋值,并执行SQL语句

EXEC SQL PREPARE stat FROM :SQL;//准备执行一条SQL语句,

EXEC SQL EXECUTE stat USING :id, :name;//根据输入宿主变量的值,执行SQL

2.10  动态SQL3

strcpy(SQL, "select id, name from table1 where id = :n");

EXEC SQL PREPARE stat FROM :SQL;//要准备执行动态SQL。

EXEC SQL DECLARE C1 CURSOR FOR stat;//定义一个光表,名字叫C1

EXEC SQL OPEN C1 USING :n;//在光标 C1中使用输入宿主变量n

EXEC SQL OPEN C1;//打开光标C1

EXEC SQL WHENEVER NOT FOUND DO break;//循环读取光标C1,读取表中每一行,直到最后没有数据,循环break

while(1)

{

EXEC SQL FETCH C1 INTO :id, :name;/ /将查询结果放入到输出变量id,name

printf("id = %d, name = %s\n", id, name);

}

2.11  动态SQL4

EXEC SQL BEGIN DECLARE SECTION;

int i, iOutput_count, iOccurs, iType , iLen;

short iInd;

char sData[1024];//存放select查询数据的返回buffer

char sOutput[64];

char sInput[64];

const char *SQL;

EXEC SQL END DECLARE SECTION;

SQLCODE = 0;

iLen = sizeof(sData);//指示buffer大小

iType = 12;//所有select返回的数据集,都按照varchar2类型来处理

SQL = DySQL;

sprintf(sOutput, "output%p", pContext);//只是为了动态生成一个系统当中不重复的字符串

sprintf(sInput, "input%p", pContext);//只是为了动态生成一个系统当中不重复的字符串

EXEC SQL ALLOCATE DESCRIPTOR :sOutput;//分配SELECT语句查询输出结果缓冲区

EXEC SQL ALLOCATE DESCRIPTOR :sInput;

EXEC SQL PREPARE S FROM :SQL;//准备执行相应的SQL语句

if (SQLCODE != 0)

{

sql_error();

EXEC SQL DEALLOCATE DESCRIPTOR :sOutput;//释放SELECT语句查询输出结果缓冲区

EXEC SQL DEALLOCATE DESCRIPTOR :sInput;

return 1;

}

EXEC SQL DECLARE C CURSOR FOR S;

EXEC SQL OPEN C USING DESCRIPTOR :sInput;//使用输入缓冲区打开一个光标

//选择输出缓冲区

EXEC SQL DESCRIBE OUTPUT S USING DESCRIPTOR :sOutput;

//得到SELECt语句返回多少列

EXEC SQL GET DESCRIPTOR :sOutput :iOutput_count = COUNT;

for(i=0;i<iOutput_count;i++)

{

iOccurs = i + 1;

EXEC SQL SET DESCRIPTOR :sOutput

VALUE :iOccurs TYPE = :iType, LENGTH = :iLen;

}

EXEC SQL WHENEVER NOT FOUND DO break;

while(1)

{

EXEC SQL FETCH C INTO DESCRIPTOR :sOutput;//得到每一行

for(i = 0;i<iOutput_count;i++)//得到每行当中的每列

{

iOccurs = i +1;

memset(sData, 0, sizeof(sData));

EXEC SQL GET DESCRIPTOR :sOutput

VALUE :iOccurs :sData = DATA, :iInd = INDICATOR;

if (iInd == -1)//没有数据

{

printf("%s\t", "NULL");

}else

{

printf("%s\t", sData);

}

}

printf("\n");

}

EXEC SQL CLOSE C;

EXEC SQL DEALLOCATE DESCRIPTOR :sOutput;//释放SELECT语句查询输出结果缓冲区

EXEC SQL DEALLOCATE DESCRIPTOR :sInput;

时间: 2024-08-02 11:04:26

【C/C++学院】(25)Oracle数据库编程--proc编程的相关文章

在.NET开发面向Oracle数据库的应用程序

其实这个不是一个什么新的话题.但是之前在多次项目中,总是遇到大家针对Oracle数据库的访问时,会有各种各样的问题,最基本的就是要在客户端安装各种client,版本不一样的话还有各种问题. 静下心来看看,其实也没有那么难.我这里总结一下,如何在.NET应用程序中,简单优雅地使用Oracle数据库. 第一个原则:不要依赖 最好的情况就是,程序自己就可以完成数据访问,不需要额外地安装所谓的Oracle Client,那是一个很麻烦而且痛苦的事情. 我们首先看看,如果不装任何东西,是否可以实现Orac

Oracle Proc编程性能优化经验

Proc 是Oracle提供的一种数据库操作的AP.它是基于ESql技术的,需要预编译后才可以变成普通c代码,非常不直观,使用起来不太方便,阅读也存在困难. 因为这些问题导致程序员平时开发中会出现一些Proc操作存在效率低下的情况,本文介绍一些Proc一些编译经验,希望能给大家提供参考. 下面以一个简单需求进行举例说明: 要求把DB1里面一张数据表tbl_hch_test的数据导出到DB2的同名表. 最快的方法当然是使用oracle的数据泵工具进行压缩导出再导入,但expdp/impdp对数据库

ORACLE数据库编程

第一章 Oracle数据库基本概念 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为 核心的一组软件产品,是目前最流行的客户/服务器(Client/Server,C/S)或 浏览器/服务器(Browser/Server,B/S)体系结构的数据库之一.二.特点1.完整的数据管理功能:数据的大量性数据的保存的持久性数据的共享性数据的可靠性Oracle优点:可用性强可扩展性强数据安全性强稳定性强三.Oracle数据库的辑逻结构1.表空间一个数据库被分割为数个被称作

51CTO学院四周年课程分享:Oracle数据库课程优惠活动清单1.0

        51CTO学院四周年活动(7月1日-7月7日)       Oracle数据库课程优惠活动清单(1年只有1次)  微职位优惠2000+.视频单课原价6折.视频套餐折上8折 活动预约QQ:176140749(风哥);   学习交流QQ群:199479729.158277749 推荐活动一:Oracle 云数据库高级工程师微职位(九大阶段.高薪就业.辅导培训) --立减2000元+ 活动地址 http://edu.51cto.com/px/train/131?xiaotu 课程试听

asp数据库编程:在ASP中使用Oracle数据库

Oracle是世界上用得最多的数据库之一,活动服务器网页(ASP)是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言.许多ASP开发人员一直在考虑,能否在开发互联网应用.电子商务网站.互联网管理系统时结合使用ASP和Oracle数据库?这个问题的答案是肯定的,我们还可以使用VB访问Oracle数据库.在本篇文章中,我们将主要讨论如何使用ASP来处理Oracle数据库中数据的方法. 在开始讨论这个问题前,我们需要了解几个背景知识,Oracle Objects for OLE就是其中之一.Or

最近面试oracle 数据库的知识点

1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性 2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL 微观上: 从数据类型,数据库的结构等等回答 2. 如何使用Oracle的游标? 1).  oracle中的游标分为显示游标和隐式游标 2

Oracle数据库基础知识

oracle数据库plsql developer 目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外键 创建删除索引 创建修改删除视图 二     SQL查询 基本的SQL语句 unionminusintersect 内连接外连接 子查询关联子查询 betweeninexists 复制表insert into selectselect into from 三     SQL查询优化 尽量少用 IN 操

Oracle数据库之开发PL/SQL子程序和包

Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后

dos命令行连接操作ORACLE数据库

C:\Adminstrator> sqlplus "/as sysdba" 查看是否连接到数据库 SQL> select status from v$instance; v$动态表开头,查看动态实例,open为启动. SQL> shutdown immediate关闭数据库 SQL> startup 继续启动 SQL> show parameter db_name 查看数据库名称 查询数据库SCOTT用户默认的状态 SQL> select usern