EXEC SQL BEGIN DECLARE SECTION;
/*…相关语句…*/
EXEC SQL END DECLARE SECTION;
SQL变量的类型声明语言:VARCHAR name[15];
EXEC SQL INCLUDE 语句
EXEC SQL VAR语句
EXEC SQL TYPE语句
?
?
名称 |
内部数据类型 |
代码 |
描述 |
NEXTVAL |
NUMBER |
2 |
{dy}次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用
sequence.NEXTVAL。{dy}次引用 NEXTVAL,返回序列的初始值。
后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值
|
CURRVAL |
NUMBER |
2 |
返回当前的序号,{dy}次使用需要先使用nextval |
ROWNUM |
NUMBER |
2 |
返回结果集序号,用于显示当前行号 |
LEVEL |
NUMBER |
2 |
用于返回树结构中一节点的层次号 |
USER |
VARCHAR2 |
1 |
当前ORACLE用户 |
UID |
NUMBER |
2 |
返回赋给ORACLE用户{wy}的ID |
SYSDATE |
DATE |
12 |
返回当前日期和时间 |
?
名称 |
代码 |
描述 |
VARCHAR2 |
1 |
不定长字符串>=2000字节 |
NUMBER |
2 |
浮点数 |
INTGER |
3 |
? |
FLOAT |
4 |
浮点,通常要求4或8字节 |
STRING |
5 |
以NULL结尾的字符串 |
VARNUM |
6 |
变长数,类似NUMBER,{wy}区别是{dy}个字节存储该值的长度 |
LONG |
8 |
变长字符串,{zd0}为2G字节,类似VARCHAR2 |
VARCHAR |
9 |
变长字符串,它含2字节的长度字段和小于65533字节的串字段,对于VARCHAR数组元素 |
ROWID |
11 |
标识行号 |
DATE |
12 |
定长日期 |
VARRAW |
15 |
变长2进制数据,存储2进制数据或字符串 |
RAW |
23 |
定长2进制数据,存储2进制传,{zd0}255字节 |
LONGRAW |
23 |
变长2进制数据,{zd0}长度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进制数据 |
?
?
?
?
?
?
- 字符串必须以NULL中介,可以显示的声明变量等价保证,select活fetch出的字符串以NULL终结
- 使ORACLE只保存不解释数据,比如float类型以longraw形式在数据库
struct 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;
?
?
- 只能使用1维数组,如果为2维的char[][],ORACLE将其认为是1维的char*[]
- 可以声明数组,但是不能进行初始化
- 可以使用的关键字有auto,extern,static,const.volatile
- 不可以使用的有register
- 在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语言的用法
- PRO *C不支持指针数组
- PRO *C只支持一维数组,而char[][]会被认为是一维字符串
- 数组{zd0}维数为32767,超过此限制会有有一个异常产生
- SQL语句中只需要写数据名与前缀运算符:,不需要写下标
- 省去程序设计,省去大量不必要的变量命名和引用
- 改进程序性能,可以将批操作使用数组进行
- 当SQL语句中引用多个数组,这些数组的维数应该是相同的,否则PRO C会以最小的数组维数进行运算,并发出警告
- 在VALUES,SET,INTO或者WHERE语句中,不允许简单的把SQL变量与数组SQL变量混用
- 在UPDATE或DELETE语句中,不允许把数组和CURRENT OF子句一起使用
在声明为VARCHAR vstring[20];的时候(必须指出大小,范围1~65533)
预编译截断会被翻译成C语言的一个结构变量
struct{
unsigned short len;
unsigned char arr[20]’
}vstring
- SQL语句中需要使用:作为前准
- C语言中与结构体用法一致
VARCHAR vstring[100];
EXEC SQL SELECT XXX INTO :vstring FROM…
则需要
vstring.arr[vstring.len]=’\0’;
用vstring的内容长度,在其{zh1}一位标上NULL表示终结
?
而如果作为输入,则需要预先将长度计算后赋予len属性中。
?
?
?
?
?
?
?
?
?
?
?
?