proc/c++是什么?持续更新中
oracle预编译工具。 c/c++语言中嵌入sql,使用各厂商自己的预编译工具编译为对应的c/c++程序,所以称为pro*C/C++
- oracle 预编译工具是什么
用户在高级语言程序中写嵌入式SQL,预编译工具最终可以将其转换为标准的oracle调用,并且可以产生一个新的可以编译的c/c++源文件。 - 为什么要用oracle pro*C/C++预编译工具?
方便快捷且使用灵活,性能高的访问数据库 - 预编译工具为什么要用PL/SQL?
作为SQL的扩展,PL/SQL是支持流程处理、变量声明、还有强大的错误处理能力,在PL/SQL处理块可以使用SQL和PL/SQL扩展预言。
最大的优点是它有更好的性能,PL/SQL能够让你获取一组数据,而不是像SQL一样,一条条的获取数据。
关键概念
嵌入式SQL分类:可执行语句和指令
嵌入式SQL可以让你在oracle 程序和主机程序之间交换数据。嵌入式的SQL分为两种类型,可执行语句和指令。
-
可执行语句,最终会转化为SQLLIB库的标准库调用,比如连接数据库、查询、修改oracle数据。
-
指令,不会调用SQLLIB库,也不会处理oracle数据,主要是声明oracle 变量,声明交互区以及SQL 变量
包括如下(没列全)
静态和动态SQL语句
很多应用程序只需要静态SQL就足够了,在程序执行前,就可以知道程序SQL的具体命令,那些数据库表会被修改,那些列会被修改等等
然而一些应用知道程序运行时,才会知道具体的SQL命令,涉及哪些数据库表,表中的哪些字段等等。动态SQL是一种高级的编程技术,可以实现程序运行时才建立明确的SQL。
嵌入式PL/SQL块
pro*C/C++ 处理PL/SQL块像单条SQL语句一样。将PL/SQL嵌入主机程序,可以使用EXEC SQL EXECUTE和END-EXEC声明PL/SQL块,它支持所有的SQL数据处理和处理命令。
宿主和指示变量
- 宿主变量
宿主变量是oracle和应用程序通信的关键。宿主变量是用C声明的变量,但是可以在oracle中使用的变量,这意味这两个程序可以共享该变量。
你的程序使用输入主机变量传递数据给oracle,oracle使用输出的主机变量传递数据和状态信息给你的程序。
在嵌入式SQL语句中,宿主变量必须加上前缀: 来跟其他SQL关键字区分开。
宿主变量也可以是struct类型。 - 指示变量
宿主变量可以和可选的指示变量关联。一个指示变量是一个short类型的变量,用来指示宿主变量的值或者状态。使用指示变量可以给输入宿主变量赋值为NULL,或者检测输出宿主变量值为NULL或者截断输出宿主变量的值。NULL值是一个不确定的值。
在SQL语句中,指示变量必须加上前缀 : 后面必须马上跟上关联的宿主变量。宿主变量和它的指示变量之间可以使用关键字INDICATOR。
如果宿主变量是struct类型的并且你想使用指示变量,应该创将一个struct,含有宿主变量structure中每一个变量,这个struct的指示变量声明跟单变量相同,需要‘’:前缀,后面跟上关联的宿主变量。
oracle数据类型
oracle保存宿主程序的输入数据,也保存输出数据到程序的宿主变量。为了保存数据,oracle必须清楚数据类型,包括格式和合法的取值范围。
oracle的数据类型分类为内部和外部类型两种。内部数据类型是oracle用来描述数据是怎么存储在数据库的列中的,
外部数据类型用于宿主变量的数据存储。如果必要,oracle可以在内部和外部类型之间转换。
私有SQL区,游标,活动区
为了处理SQL 语句,Oracle 会打开一个私有SQL工作区。它用来执行SQL语句。游标可以让你命名SQL语句,某种程度上控制处理过程。
静态SQL语句,有两种类型的游标,隐式和显示。oracle会隐身声明一个游标,用于数据定义和处理,包括select。如果处理结果包括多个,必须显示声明游标或者使用数组变量中的数组。
返回的结果集合成为活动区。
错误和警告
proc程序提供了两种错误处理机制:SQLCA(SQL Communications Area )和WHENEVER语句
SQLCA可以提供你刚试图操作是否成功的反馈。
WHENEVER可以提供一种自动机制当oracle检测到错误或者warning发生的时候。
编程指导
常量
L long / U unsigned int/0X 16进制 /F float
声明宿主变量
EXEC SQL BEGIN DECLARE SECTION;
char *uid = “username/password”;
EXEC SQL END DECLARE SECTION;
行扩展
一行放不下,使用反斜杠\连接下一行
宿主变量名
大小写字母 下划线 数字组合,开头必须是字母。
Operators
支持如下SQL对应列的操作符
语句结束符
嵌入式SQL用;结束,如下:
EXEC SQL DELETE FROM emp WHERE deptno = :dept_number;
条件预编译
类似于C中的#define,包括如下:
EXEC ORACLE DEFINE symbol; – define a symbol
EXEC ORACLE IFDEF symbol; – if symbol is defined
EXEC ORACLE IFNDEF symbol; – if symbol is not defined
EXEC ORACLE ELSE; – otherwise
EXEC ORACLE ENDIF; – end this control block
符号定义
包含在语句中 EXEC ORACLE DEFINE symbol;
命令行… DEFINE=symbol …
总结
oracle的预编译工具,支持预编译编PL/SQL扩展的SQL嵌入语言,编译成标准的高级语言。
参照文档
https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/whatsnew.htm#CJABCEHH