一、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;