PROC基础知识之指示变量变量

来源:互联网 发布:qq飞车曙光伯爵数据 编辑:程序博客网 时间:2024/05/29 14:33

•          指示器变量是与宿主变量相关联的一类SQL变量,它被用来监督和管理与其相关联的宿主变量,每一个宿主变量都可以定义一个指示器变量。指示器变量的具体作用如下:

(1)       向数据库表列输入NULL值

(2)       检查从数据库表列中选取的数据是否是NULL值,或是否发生截断问题

•          指示变量必须被定义为2 个字节的整数类型(short)

•          在SQL 语句中,如果没有指定INDICATOR 关键字,指示变量必须紧跟在与其关联的宿主变量后

•          如果使用DECLARE SECTION 声明宿主变量,则相关指示变量也必须用DECLARE SECTION 进行声明

•         在SQL 语句中指示变量前也需要加入“:”指示符

:host_variable INDICATOR :indicator_variable

等效于

:host_variable:indicator_variable

•         指示变量的值,及其代表的含义如下:

Ø       0 操作成功

Ø       -1 该指示变量对应的宿主变量返回了或插入、更新成了NULL 值

Ø       -2 从数据库存放数据到对应的宿主变量时,数据超长,并且不能推断出截断了多少字节的长度

Ø       >0 在FETHC 或SELECT 语句时,因数据超长而被截断存放在了对应的宿主变量中,指示变量存放对应列的长度

         如果不用指示变量在SELECTFETCH语句中将一个NULL值赋给宿主变量时,Oracle会报1405错误。为了避免这种情况,可以采用两种解决方法:

Ø       使用指示变量

Ø       调整Pro*C/C++预编译程序proc 的命令行参数,设定MODE=ORACLE,UNSAFE_NULL=YES

 

指示器变量的引用:

  在SQL语句中,指示器变量名字前应加冒号,而且必须在其相关联的宿主变量之后。在C语言中,指示器变量如同C变量一样独立使用,不须前缀冒号,也不须跟在相关宿主变量之后。例如:

EXEC SQL SELECT EMPN()

               INTO::emp_number:ind_num

               FROM EMP

               WHERE ENAME = :emp_name;

If (ind_num  =  -1)

{

        Printf(“employlee number is NULL!”);

}

为了增进可读性,可以再宿主变量及其指示器变量之间加INDICATOR关键词。如:

EXEC SQL SELECT EMPNO

        INTO:emp_number INDICATOR:ind_num

        FROM EMP

        WHERE ENAME = :emp_name;

 

指示器变量的应用举例:

1:向数据库表列中插入NULL

Printf(“enter department number and name”);

Scanf(“%d%s”, &dept_number, dept_name);

If (dept_number = 0)

{

        Ind_num = -1;

}

else

{

        Ind_num = 0;

}

EXEC SQL INSERT INTO DEPT(DEPTNO,DNAME)VALUES(:dept_number:ind_num, :dept_name)

其中ind_num是dept_number的指示器变量,当输入的dept_number的值是0的时候,则向DEPT表的DEPTNO列插入NULL值

 

2:检查从数据库表列中检索的值是否为NULL

EXEC SQL BEGIN DECLARE SECTION;

int          emp_number;

float              salary, commission;

short              ind_comm; /* 指示变量 */

EXEC SQL END DECLARE SECTION;

 

EXEC SQL SELECT SAL, COMM

INTO :salary, :commission:ind_comm

FROM EMP

WHERE EMPNO = :emp_number;

if( -1 == ind_comm ) /* commission变量是NULL */

        pay = salary;

else

        pay = salary + commission;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 签到后,小白花她在娱乐圈翻红了 江月照 魂飞魄散的上古大仙在修真界诈尸 快穿:大佬她又抢了反派剧本 夫人她总想逃 穿成阴戾反派未来嫂嫂 上神大人他偏甜系啊 咸鱼后妈带崽在综艺当对照组 系统BUG让我成了舔包专业户 快穿:系统有的是力气和手段 当我的霸总老公有了读心术 穿成炮灰渣妻后我和反派开农场 前任小姐姐帅又飒 弄潮1990从厂长开始 光阴之外 心动侵占 重回逃荒开端,手握空间来逆袭 重生之网红教父 蛮荒求生:反派大佬被迫种田 玄学大佬在星际重建地府 总裁又惹火夫人了 农门空间:重生娇娘撩糙汉 重生后我弃了天运之子 快穿:绑定系统后我疯狂崩人设 慕爷你虐错了夫人就是白月光 欢乐班 快穿之反派今天也在求负责 喜提娇夫:快穿作精她被迫崛起了 修真大佬都是我 唐人的餐桌 重生之大小姐她换了黑莲花剧本 重回九零做学霸 穿越星际之直播探险生活 我在古代做美食博主 小机器人每天都在劝我追校草 救命!隐婚老公当着全球撩我 仙子她一心修仙 快穿:主神他好撩人 修真界如今不太平 我与帝君虚情假意后he了 女法医她靠玄学飒翻天