【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-10-30 04:05:59

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

asp.net中使用vb.net编程读取oracle数据库

问题描述 asp.net中使用vb.net编程读取oracle数据库 小弟刚学asp.net现在数据库连接完成,我在某一列插入了数据,我想在页面中读取出来,我使用的代码为 Dim sqlStr As String = "select*from AGVNEW1 where agvId" Dim myCmd As OracleCommand = New OracleCommand(sqlStr, myconnection) myCmd.Parameters.Clear() myCmd.Pa

JDBC连接Oracle数据库常见问题及解决方法_JSP编程

注:本文是斑竹从JDBC & Transaction版摘录广大站友的提问以及各种解答整理而来,如果您认为本文的内容已触犯了您的权益,请联系管理员进行修改. Jbuilder正确连接 oracle 9i需要注意的几个问题 oracle8以上的应该都使用classes12.jar文件作为jdbc驱动: 正确设置windows的classpath和jbuilder中的enterprise setup .configure libraries,将casses12.jar路径正确添加到上述需要设置的地方:

在JSP中访问Oracle数据库_JSP编程

写第一个连接Oracle的JSP程序test.jsp1.连入SQL*Plus以system/manager用户登录,SQL> conn system/manager创建新的用户:如user1/pass1,赋予connect,resource权限.SQL> grant connect,resource to user1 identified by pass1;SQL> conn user1/pass1SQL> create table test(a number,b char(10)

探讨ORACLE数据库的数据导入方法

oracle|数据|数据库 前言每个数据库管理员都会面临数据导入的问题,这有可能发生在数据库的新老移植过程中,或者是在数据库崩溃后的恢复重建过程中,还有可能是在创建测试数据库的模拟环境过程中,总之作为一名合格的数据库管理员,你应该做好接受各种数据导入请求的技术储备,同时还要尽量满足人本能的对导入速度的苛求.本文仅针对 Oracle 数据库所提供的加速数据导入的各种特性和技术进行探讨,其中的一些方法也可以转化应用于其他数据库.以下七种数据导入方法哪个最适用需要针对具体情况具体分析,我也附带列举了影

oracle数据库开发的一些经验积累(一)

oracle|数据|数据库 1.不安装Oracle客户连接Oracle 8的方法请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll 二.建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下 EXTRA\MSVCRT.DLL 三.ORACLE动态库及配置文件 Tnsnames.or

把Oracle数据库移植到Microsoft SQL Server 7.0

oracle|server|数据|数据库  把Oracle数据库移植到Microsoft SQL Server 7.0 摘要:本文是为那些想把自己的Oracle应用程序转换为Microsoft SQL Server应用程序的开发人员编写的.本文描述了一个成功的转换所需要的工具.过程和技术.同时强调了建立高性能.高度并行的SQL Server应用程序的基本的设计要素. 本文的读者应该具有: Oracle关系型数据管理系统(RDBMS)的坚实基础. 普通数据库管理知识. 熟悉Oracle SQL和P

在 .NET中使用Oracle数据库事务

oracle|数据|数据库     在本文中,您将了解到如何在 Visual Basic .NET (VB.NET) 和 Visual C# .NET (C#) 中使用数据库事务.具体来讲,您将系统学习数据库事务.在 .NET 程序中使用 OracleTransaction 对象以及如何设置事务保存点.本文中引用的所有脚本和文件都在这里提供.本文假定您大体上熟悉 C# 和 VB.NET 编程. 所需软件 如果您要跟随我们逐步完成本文中给出的示例,那么您需要安装以下软件: Windows NT 4

关于炉石传说的Oracle数据库故障不要以为你也可以幸免

最近暴雪公司和网易的一则声明刷爆了朋友圈,大意就是由于『供电意外中断的原因而产生故障,导致数据损坏』,这样一则公告引发了一系列的猜想,我们在围观时仿佛人人都是诸葛亮,而事实上设身处地,我想在一次负责任的故障考验下,也许很少有人能够幸免. 如同阿里云会误删文件.京东会泄露数据.支付宝会被修改密码.携程会大面积瘫痪,在灾难来临之前,谁都会觉得自己是幸运者,而事实上,只是措手不及那次灾难还没有来到而已. 先回顾一下<炉石传说>长长的公告,然后我们再基于事实做一下分析吧: 首先,关于暴雪的核心数据库架

使用Java调用Oracle数据库的存储过程实例

使用Java调用Oracle数据库的存储过程实例时间:2009-08-19 18:02:43来源:网络 作者:未知 点击:984次 一:无返回值的存储过程1.建立存储过程CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA; 2.相应的JAVA程序impo一:无返回值