Pro*C入门手册+语法详解

Pro*C入门手册+语法详解

概述

嵌入式 SQL 是一种结合 C/C++ 等高级语言的计算能力和 SQL 的数据库操作能力的方法。它允许您从应用程序执行任何 SQL 语句。Oracle 的嵌入式 SQL 环境称为 ProC。
Pro
C 程序分两步编译。首先,Pro*C预编译器 识别程序中嵌入的 SQL 语句,并将它们替换为对 SQL 运行时库中函数的适当调用。输出是纯 C/C++ 代码,所有纯 C/C++ 部分都完好无损。然后,使用常规 C/C++ 编译器编译代码并生成可执行文件。有关详细信息,请参阅演示程序部分。

Pro*C 语法

SQL

所有 SQL 语句都需要以EXEC SQL开头并以分号“ ; ”结尾。您可以将 SQL 语句放置在 C/C++ 块中的任何位置,但限制是声明性语句不在可执行语句之后。举个例子:

    {
   
        int a;
        /* ... */
        EXEC SQL SELECT salary INTO :a
                 FROM Employee
                 WHERE SSN=876543210;
        /* ... */
        printf("The salary is %d\n", a);
        /* ... */
    }
预处理器指令

与 ProC 一起使用的 C/C++ 预处理器指令是#include 和#if。ProC 无法识别#define。例如,以下代码无效:
应该仅仅是#define 定义的宏不能用于SQL语句。

#define THE_SSN 876543210
/* ... */
EXEC SQL SELECT salary INTO :a
         FROM Employee
         WHERE SSN = THE_SSN;    /* 无效的*/
声明标签

您可以将 C/C++ 标签与 SQL 连接起来,如下所示:

    EXEC SQL WHENEVER SQLERROR GOTO error_in_SQL;
    /* ... */
 error_in_SQL:
    /* 进行错误处理 */

我们将在稍后的错误处理部分讨论WHENEVER的含义。

宿主变量

基本

宿主变量是宿主程序与数据库之间通信的关键。宿主变量表达式必须解析为左值 (即,它可以被赋值)。您可以根据 C 语法声明宿主变量,就像声明常规 C 变量一样。宿主变量声明可以放置在可以放置 C 变量声明的任何位置。(C++ 用户需要使用声明部分;请参阅C++ 用户部分。)可用于 Oracle 的 C 数据类型包括:

char
char[n]
int
short
long
float
double
VARCHAR[n] - 这是 Pro*C 预编译器识别的伪类型。它用于表示空白填充的可变长度字符串。Pro*C 预编译器会将其转换为具有 2 字节长度字段和n字节字符数组的结构。

您不能对宿主变量使用寄存器 存储类说明符。

宿主变量引用在 SQL 语句中必须以冒号“ : ”为前缀,但在 C 语句中不应以冒号为前缀。通过宿主变量指定字符串文字时,必须省略单引号;Pro*C 理解您正在根据宿主变量的声明类型指定字符串。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);         /* 合法的 */
    EXEC SQL INSERT INTO emp(empno, ename, deptno)
        VALUES(:x + 1,              /* 合法的: 引用 x */
               'Big Shot',          /* 合法的: 但不是真正的宿主变量 */
               :deptnos[2]);        /* 合法:数组元素很好 */
    EXEC SQL INSERT INTO emp(empno, ename, deptno)
        VALUES(:x, :y,
               :(*(deptnos+2)));    /* 非法:尽管它有一个左值 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值