概要
内嵌SQL是结合高级语言如C/C++的计算能力和SQL数据库处理能力的一种方法。它允许你在程序中执行任意的SQL语句。Oracle的嵌入SQL环境称为Pro*C。
Pro*C程序分两步编译。首先,Pro*C的预编译器识别出嵌入在程序中的SQL语句,并将这些语句转换为对SQL运行时库(SQL runtime library)中功能(functions)的适当调用。输出是纯C/C++代码和未被处理的纯C/C++代码。然后,用常规C/C++编译器编译代码并生成可执行程序。更详细的内容请参考Demo程序。
语句标号
可以在SQL中跳转到C/C++标记
EXEC SQL WHENEVER SQLERROR GOTO error_in_SQL;
/* ... */
error_in_SQL:
/* do error handling */
我们会在后面的错误处理一节中讲到有关WHENEVER的含意。
错误处理一节中讲到有关WHENEVER的含意。基础
宿主变量是连接宿主程序与数据库的关键。宿主变量表达式必须视为(resolve to)左值(能被赋值)。你可以像声明普通C变量一样,按着C的语法规则声明宿主变量。宿主变量的声明可以放置在任何C变量声明可以放置的地方。(C++用户需要使用"DECLARE SECTION";参考C++ Users) Oracle可以使用的C数据类型包括:
C++ Users) Oracle可以使用的C数据类型包括:- char
- char[n]
- int
- short
- long
- float
- double
- VARCHAR[n] - 它是能被Pro*C的预编译器识别的预处理类型(psuedo-type)。它用来 表示由空白填充(blank-padded,译注:'\0')的变长字符串。Pro*C预编译器会把它转换为有一个2字节(byte)长的域和一个n字(byte)长的字符数组的结构体。
你不能指定寄存器存储类型(译注:指针)为宿主变量。
可以在SQL表达式中使用冒号":"做前缀来引用一个宿主变量,但不能在C表达式中用分号做前缀。当使用字符串作为宿主变量时,必须省略引用;Pro*C明白你正指定一个基于宿主变量声明类型的字符串(译注:这句的意思是,当定义一个字符串做为宿主变量时char *str="string",在嵌入SQL中使用时,要省略"*"而不是*str)。不能将C函数调用和多数的指针计算表达式作为宿主变量使用,即使它们确实被解释为左值。下面的代码同时说明了合法和不合法的宿主变量的引用:
int deptnos[3] = { 000, 111, 222 };
int get_deptno() { return deptnos[2]; }
int *get_deptnoptr() { return &(deptnos[2]); }
int main()
{
int x; char *y; int z;
/* ... */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y, :z); /* LEGAL */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x + 1, /* LEGAL: the reference is to x */
'Big Shot', /* LEGAL: but not really a host var */
:deptnos[2]);/* LEGAL: array element is fine */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y,
:(*(deptnos+2)));/* ILLEGAL: although it has anlvalue */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y,
:get_deptno()); /* ILLEGAL: no function calls */
EXEC SQL INSERT INTO emp(empno, ename, deptno)
VALUES(:x, :y,
:(*get_depnoptr())); /* ILLEGAL: although it has an lvalue */
/* ... */
}
| 声明表达式 | |
| EXEC SQL ARRAYLEN | 在PL/SQL中使用宿主变量 |
| EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION |
声明宿主变量 |
| EXEC SQL DECLARE | 给Oracle对像命名 |
| EXEC SQL INCLUDE | 从文件中复制 |
| EXEC SQL TYPE | 同等化数据类型 |
| EXEC SQL VAR | 同等化变量 |
| EXEC SQL WHENEVER | 处理运行时错误 |
| 执行表达式 | |
| EXEC SQL ALLOCATE | 声明、控制Oracle数据 |
| EXEC SQL ALTER | |
| EXEC SQL ANALYZE | |
| EXEC SQL AUDIT | |
| EXEC SQL COMMENT | |
| EXEC SQL CONNECT | |
| EXEC SQL CREATE | |
| EXEC SQL DROP | |
| EXEC SQL GRANT | |
| EXEC SQL NOAUDIT | |
| EXEC SQL RENAME | |
| EXEC SQL REVOKE | |
| EXEC SQL TRUNCATE | |
| EXEC SQL CLOSE | |
| EXEC SQL DELETE | 排序、修改Oracle数据 |
| EXEC SQL EXPLAIN PLAN | |
| EXEC SQL FETCH | |
| EXEC SQL INSERT | |
| EXEC SQL LOCK TABLE | |
| EXEC SQL OPEN | |
| EXEC SQL SELECT | |
| EXEC SQL UPDATE | |
| EXEC SQL COMMIT | 处理事务 |
| EXEC SQL ROLLBACK | |
| EXEC SQL SAVEPOINT | |
| EXEC SQL SET TRANSACTION | |
| EXEC SQL DESCRIBE | 使用动态SQL |
| EXEC SQL EXECUTE | |
| EXEC SQL PREPARE | |
| EXEC SQL ALTER SESSION | 控制会话 |
| EXEC SQL SET ROLE | |
| EXEC SQL EXECUTE END-EXEC |
内嵌PL/SQL块 |