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

简介: <h1 style="font-family:'Microsoft YaHei UI','Microsoft YaHei',SimSun,'Segoe UI',Tahoma,Helvetica,sans-serif,'Microsoft YaHei',Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,serif; line-height:15.5

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


目录
相关文章
|
15天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
56 7
|
30天前
|
安全 算法 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
47 3
|
1月前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
170 0
|
1月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
248 3
|
24天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
1月前
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
246 0
|
1月前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
259 2
|
15天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
41 5
|
1天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
1天前
|
算法 编译器 C语言
探索C++编程的奥秘与魅力
探索C++编程的奥秘与魅力

推荐镜像

更多