一、变量声明
声明区域
EXEC SQL BEGIN DECLARE SECTION;
/*…相关语句…*/
EXEC SQL END DECLARE SECTION;
声明区域中允许的语句
SQL变量的类型声明语言:VARCHAR name[15];
EXEC SQL INCLUDE 语句
EXEC SQL VAR语句
EXEC SQL TYPE语句
二、数据类型
内部数据类型
类型 代码 描述 VARCHAR2 1 不定长字符串,<=2000字节 NUMBER 2 浮点数 LONG 8 2147483647字节 ROWID 11 16进制数 DATE 12 日期,时间,7个字节 RAW 23 定长2进制数据,255字节 LONGRAW 24 变长2进制数据,2147483647字节 CHAR 96 定长串,255字节 MLSLABEL 105 定长2进制标号,5个字节SQL伪劣和函数
名称 内部数据类型 代码 描述 NEXTVAL NUMBER 2
第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用
sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。
后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值CURRVAL NUMBER 2 返回当前的序号,第一次使用需要先使用nextval ROWNUM NUMBER 2 返回结果集序号,用于显示当前行号 LEVEL NUMBER 2 用于返回树结构中一节点的层次号 USER VARCHAR2 1 当前ORACLE用户 UID NUMBER 2 返回赋给ORACLE用户唯一的ID SYSDATE DATE 12 返回当前日期和时间
外表数据类型
名称 代码 描述 VARCHAR2 1 不定长字符串>=2000字节 NUMBER 2 浮点数 INTGER 3 FLOAT 4 浮点,通常要求4或8字节 STRING 5 以NULL结尾的字符串 VARNUM 6 变长数,类似NUMBER,唯一区别是第一个字节存储该值的长度 LONG 8 变长字符串,最大为2G字节,类似VARCHAR2 VARCHAR 9 变长字符串,它含2字节的长度字段和小于65533字节的串字段,对于VARCHAR数组元素 ROWID 11 标识行号 DATE 12 定长日期 VARRAW 15 变长2进制数据,存储2进制数据或字符串 RAW 23 定长2进制数据,存储2进制传,最大255字节 LONGRAW 23 变长2进制数据,最大长度2G,其他同RAW UNSIGNED 68 无符号数,2进制数,2或4字节,并需指定长度 LONGVARCHAR 94 变长字符串,由 长度和字符串组成,长度为前4位,字符串长度为2G LONGVARRAW 95 变长2进制数据,类型LONGVARCHAR CHAR 96 定长数组最长255 CHARZ 97 C中以NULL结尾的字符串,最长255字节 MLSLABEL 106 变长2进制数据
SQL变量数据类型
C语言数据类型 描述 char 单字符 char[n] 字符串 int 整数 short long float double VARCHAR[n] 变长字符串
三、数据类型的关联
sql变量 外部数据类型 char,char[n].char* VARCHAR2 char,char[n],char* CHAR int,int* INTEGER short,short* INTEGER long,long* INTEGER float,float* FLOAT double,double* FLOAT VARCHAR[n] VARCHAR
四、类型等价
SQL变量等价
字符串必须以NULL中介,可以显示的声明变量等价保证,select活fetch出的字符串以NULL终结 使ORACLE只保存不解释数据,比如float类型以longraw形式在数据库自定义类型等价
方法1struct diagram{
short len;
char buff[4000];
};'
typedef struct digram graphics;
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE graphics is VARRAW(4000);
EXEC SQL END DECLARE SECTION;
方法二
如果变量为指针类型,而需要声明其指向的数据进行变量等价操作,可以使用REFERENCE
typedef unsigned char * my_raw;
EXEC SQL TYPE my_raw IS VARRAW(4000) REFERENCE;
五、SQL变量的声明和引用
SQL变量的声明
只能使用1维数组,如果为2维的char[][],ORACLE将其认为是1维的char*[] 可以声明数组,但是不能进行初始化 可以使用的关键字有auto,extern,static,const.volatile 不可以使用的有register
SQL变量引用
在SQL语句中变量前加上:运算符 在C语言语句中,直接使用六、指示器变量的声明和引用
指示器变量的作用
向数据库列插入NULL值 检查数据库列中选出的数据是否为NULL,是否有截断 对于输入宿主变量,有以下含义 -1:把NULL值存入数据库的表列中,而忽略宿主变量的值 >=0:把指示器变量输入宿主变量并存入数据库中 对于输出宿主变量,有以下含义 -1:数据库列的值是NULL,此时宿主变量的值为不确定状态 0:将原值赋予宿主变量 >0:将原值赋予宿主变量后,将该列中的原始长度赋予指示器变量,并充值sqlcode为0;指示器变量的声明
位于宿主变量的前或后声明short ind_deptno;
int dept_number;
指示器变量的引用
在SQL语句中变量前加上:运算符 在C语言语句中,直接使用EXEC SQL SELECT DEPT_NO INTO :dept_number :int_deptno FROM….
或加上关键字 INDICATOR
EXEC SQL SELECT DEPT_NO INTO :dept_number INDICATOR :int_deptno FROM….
七、指针变量的声明和引用
指针变量的声明
同基本类型变量声明,在DECLARE BLOCK中声明即可指针变量的引用
在SQL语句中使用:而不是* C语言中同C语言的用法八、数组变量的声明和引用
数组sql变量的声明
PRO *C不支持指针数组 PRO *C只支持一维数组,而char[][]会被认为是一维字符串 数组最大维数为32767,超过此限制会有有一个异常产生数组sql变量的引用
SQL语句中只需要写数据名与前缀运算符:,不需要写下标PRO C使用数组的优缺点
省去程序设计,省去大量不必要的变量命名和引用 改进程序性能,可以将批操作使用数组进行 当SQL语句中引用多个数组,这些数组的维数应该是相同的,否则PRO C会以最小的数组维数进行运算,并发出警告 在VALUES,SET,INTO或者WHERE语句中,不允许简单的把SQL变量与数组SQL变量混用 在UPDATE或DELETE语句中,不允许把数组和CURRENT OF子句一起使用九、VARCHAR变量的声明和引用
VARCHAR变量的声明
在声明为VARCHAR vstring[20];的时候(必须指出大小,范围1~65533)
预编译截断会被翻译成C语言的一个结构变量
struct{
unsigned short len;
unsigned char arr[20]’
}vstring
VARCHAR变量的引用
SQL语句中需要使用:作为前准 C语言中与结构体用法一致VARCHAR vstring[100];
EXEC SQL SELECT XXX INTO :vstring FROM…
则需要
vstring.arr[vstring.len]=’\0’;
用vstring的内容长度,在其最后一位标上NULL表示终结
而如果作为输入,则需要预先将长度计算后赋予len属性中。