Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158628
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-23 15:21
文章分类

全部博文(66)

文章存档

2016年(66)

我的朋友

分类: LINUX

2016-05-06 11:02:46

int test(XXX task)
{
        int                             ret;
        int                             lenOfRecStr;
        int                             recNum = 0;
        int                             failRecNum = 0;
        int                             resCode = 0;
   
        EXEC SQL BEGIN DECLARE SECTION;
                char    dateTime[14+1];
                char    cardID[128+1];
                char    oriFileName[128+1];
                char    cardNo[40+1];
                char    oriCardRecord[2048+1];
                EXEC SQL VAR cardNo IS STRING(40+1);
                EXEC SQL VAR oriCardRecord IS STRING(2048+1);
                int     status;
        EXEC SQL END DECLARE SECTION;


        XXXXX;

}


1、宿主变量的声明 

在PROC中,在SQL语句中用到的变量称为宿主变量。他们应在EXEC SQL BEGIN DECLARE SECTION;与EXEC SQL EDN DECLARE SECTION; 
之间声明,如上面所示.在声明宿主变量时应注意以下几点: 
(1) 在数据库表中定义为VARCHAR2,VARCHAR,CHAR的字段,在PROC中可声明为CHAR,但长度应为它们在表中定义的长度加1,因为PROC中 CHAR型变量用做结尾。 
 
如:ENAME在表中的定义为ename varchar2(10),在PROC中可定义为: 
EXEC SQL BEGIN DECLARE SECTION; 
char ename[11]; 
EXEC SQL END DECLARE SECTION; 
常见错误说明: 
如果插入的字符串长度大于10,如:EXEC SQL INSERT INTO EMP(ENAME) VALUES('12345678901');会出现以下错误: 
error:ORA-01480: STR 赋值变量缺少空后缀。 
 

如果定义为: 
EXEC SQL BEGIN DECLARE SECTION; 
char ename[15]; 
EXEC SQL END DECLARE SECTION; 
  
当插入的字符串长度大于15,如:EXEC SQL INSERT INTO EMP(ENAME) VALUES('12345678901234');会出现以下错误: 
error:ORA-01401:STR 赋值变量缺少空后缀。 
 

(2) 从SQL语句中取字段的值到宿主变量中时,PROC不会自动给宿主变量去掉右空格。而是以在DECLARE SECTION 中定义的长度为准(与 表中定义的无关)不足补右空格.如果不注意这一点,在PROC中进行字符串操作时(如比较相等)会出错。如: 
EXEC SQL BEGIN DECLARE SECTION; 
char ename[10]; 
EXEC SQL END DECLARE SECTION;  
如果ENAME在表中的值为'abc ',则取出的值为'abc '; 
 
可用语句EXEC SQL VAR重定义CHAR型变量。这样宿主变量会自动去掉右空格。如下:  
EXEC SQL BEGIN DECLARE SECTION; 
char ename[11]; 
EXEC SQL VAR ac_ename IS STRING(11); 
EXEC SQL END DECLARE SECTION; 
如果ENAME在表中的值为'abc',则取出的值为'abc'; 
 

(3) 对浮点型的变量,为保证精度,最好是声明成DOUBLE型的.因为DOUBLE型的精度比FLOAT型高很多. 

(4) 整型可声明为LONG型(对较长的整型,而且所用的平台支持的话,如在SUN平台上,可声明为LONG LONG型). 

(5) DATE型的处理:DATE型一般声明为CHAR(20)。 
往表中插入DATE型数据时,一般用TO_DATE()函数进行类型转换,取出值时一般用TO_CHAR()函数进行类型转换. 

    EXEC SQL select to_char(hiredate,'yyyy/mm/dd hh24:mi:ss') into :ac_hire_date from EMP where empno=1234; 

    EXEC SQL insert into EMP(EMPNO,HIREDATE) values(123,to_date(:ac_hiredate,'yyyy/mm/dd hh24:mi:ss'); 
 

阅读(1389) | 评论(0) | 转发(0) |
0

上一篇:长连接与短连接

下一篇: ORACLE-Proc:游标

给主人留下些什么吧!~~