- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* VARCHAR变量空值处理 如果Oracle 返回空值到一个VARCHAR 宿主变量,Oracle 不改变该宿主变量原arr成员存储内容,也不改变len 成员的长度 如果设置VARCHAR 类型的宿主变量len 成员值为0,在通过其对目标数据表对应列进行INSERT 和UPDATE 时,在没有非空约束情况下,Oracle 更新对应数据库表该列数据为NULL * 处理字符数据 预编译选项 CHAR_MAP CHAR_MAP=CHARZ (默认设置): ‘\0’结尾,定长,空格补齐。 CHAR_MAP=CHARF | VARCHAR2:定长,空格补齐。 CHAR_MAP=STRING: ‘\0’结尾,变长。 当‘\0’结尾,宿主变量长度要大于实际数据长度。 VARCHAR 1、变长, 不是‘\0’结尾。 2 、 struct{ unsigned short len; unsigned char arr[ ] }variable_name; * 宿主变量使用注意事项 其申明语法与普通C变量一致,但在CODE=CPP或 MODE=ANSI 时变量必须放在声明区. * 指示器变量 指示器变量是与宿主变量相关联的特殊变量,它被用来监督和管理与其相关联的宿主变量。每个宿主变量都可定义一个指示器变量。 指示器变量的作用: 指示输入宿主变量是否为NULL值。 检测输出宿主变量是否为NULL值或值是否被截断。 * 指示器变量的含义2-1 对于输入宿主变量,程序赋给指示器变量的值有如下含义: -1:ORACLE把NULL值存入数据库的表列中,而不考虑与该指示器变量相关联的输入宿主变量的值。=0:ORACLE把与该示器变量相关的输入宿主变量中的数据存入数据库表列中。 * 指示器变量的含义2-2 对于输出宿主变量,ORACLE 赋给指示器变量的值有如下含义: -1:数据库表列的值是NULL,此时,与该指示器变量相关联的输出宿主变量中的值为不确定状态。 0:ORACLE把数据库表列中的值原封不动地赋给与该指示器变量相关联的输出宿主变量中。 0:ORACLE把数据库表列中的值截断后赋给与该指示器变量相关联的输出宿主变量中。指示器变量返回一个整数值,指示该列值的原始长度,而且SQLCA 的SQLCODE 被置为0 。 * 指示器变量说明和引用 EXEC SQL BEGIN DECLARE SECTION; int dept_number; short ind_deptno; char emp_name; short ind_name; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT EMPNO INTO :emp_number :ind_num FROM EMP WHERE ENAME = :emp_name; if (ind_num = -1) printf(“Employee Number is NULL!”); 在SQL语句中,指示器变量名字前应加冒号,而且必须附在其相关的宿主变量之后。在C语句中,指示器变量如同C变量一样独立使用,不须前缀冒号,也不须跟在相关宿主变量之后,例如 * 指示器关键字 为了增进程序的可读性,可以在宿主变量及其指示器变量之间加INDICATOR关键词。如: EXEC SQL SELECT EMPNOINTO :emp_number INDICATOR :ind_num FROM EMP WHERE ENAME = :emp_name; if (ind_num = -1) Printf(“\nEmployee Number is NULL!”); * 指示器使用例子 EXEC SQL BEGIN DECLARE SECTION; VARCHAR name[20]; float salary; float comm; short ind_comm; EXEC SQL END DECLARE SECTION; EXEC SQL select ename,sal,comm into :name,:salary, :comm /*INDICATOR*/ :ind_comm from emp where empno=:empno; if (ind_comm == -1) { printf(ename=%s, sal=%f, comm=NULL\n,name.arr,salary); } else { printf(ename=%
文档评论(0)