EXEC SQL DECLARE authors CURSOR FOR SELECT EMPNO, NVL(ENAME,chr(0)),nvl(to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),chr(0)),NVL(SAL,0) FROM EMP; 这样也不会有-1405错误不,当取出的值是NULL时,自动用NVL()中指定的值代替. CHR(0)也可直接用''代替,如下: SELECT EMPNO, NVL(ENAME,''),nvl(to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),''),NVL(SAL,0) FROM EMP; 5、PROC中的错误的处理 所有的SQL语句都有可能出错.所以都要加以判断,但每个SQL语句后都加错误判断,太麻烦,可用一个函数如sql_error()来进行错误处理, 方法: (1)定义ql_error()函数。 (2)在开头加上EXEC SQL WHENEVER SQLERROR DO sql_error();这样当发生sqlca.sqlcode <0 的错误时,程序自动转到sql_error()中执行. 注意:对sqlca.sqlcode >0的错误如 sqlca.sqlcode =1403 是不会转到sql_error()中执行的. 另外:在UNIX下,可以用OERR 来查找错误的描述。如: ora ORA -1405 查找错误号为-1405的描述. 6、PROC中调用存储过程的方法 要把存储过程放在EXEC SQL EXECUTE 和 END-EXEC;之间,如下所示: 其中:al_empno,ac_ename 为输入参数,l_return,l_errno,c_errtext 为输出参数。 al_empno=8888; strcpy(ac_ename,"ABCD"); EXEC SQL EXECUTE BEGIN up_db_emp(:al_empno,:ac_ename,:l_return,:l_errno,:c_errtext); END; END-EXEC; if (l_return != 0) { printf("调用UP_PB_EMP存储过程出错,errno=%ld,errtext=%s\n",l_errno,c_errtext); } 7、PROC的命令行选项:PROC编译器有很多的命令行选项,在命令行下直接不带参数运行PROC,会列出所有的命令行选项来,并有说明。 (1)储存过程:编译储存过程是要带上用户名及密码 proc USERID=scott/tiger sqlcheck=SEMANTICS ireclen=512 iname=test.cpp (2)PARSE=NONE 对非SQL代码不进行语法分析,默认对非SQL代码也进行语法分析. 在RED HAD6.3上的ORACLE8.1.5中用PROC时,会提示:/USR/INCLUDE/STDIO.H 及其他的.H文件中有错. 可把PARSE=NONE加上,就好了. 8、注意加上:EXEC ORACLE OPTION (RELEASE_CURSOR = YES); RELEASE_CURSOR=YES 使PROC 在执行完后释放与嵌入SQL有关资源,保证在该PROC程序执行完后,ORACLE不会锁住数据库资源,如锁表等。 如果在PROC中用到ORACA,还要在程序头加上: EXEC ORACLE OPTION (ORACA=YES); 9、PROC中的类型转换 一、在C语言中: (1)字符型到整型可用ATOI() ATOL(),SSCANF() (2)整型,浮点型到字符型,可用SPRINTF() (3)字符型到浮点型用ATOF()不行,最好用SSCANF(),举例如下: EXEC SQL BEGIN DECLARE SECTION; double d_demo; float f_demo; char ac_text[20]="222"; EXEC SQL END DECLARE SECTION; (1)sscanf(ac_text, "%f", &d_demo); printf("ac_text=%s,d_demo=%f\n",ac_text,d_demo); (2)sscanf(ac_text, "%lf", &d_demo); printf("ac_text=%s,d_demo=%f\n",ac_text,d_demo); (3)sscanf(ac_text, "%f", &d_demo); printf("ac_text=%s,d_demo=%lf\n",ac_text,d_demo); (4)sscanf(ac_text, "%lf", &d_demo); printf("ac_text=%s,d_demo=%lf\n",ac_text,d_demo);
上一篇:Oracle调优(入门及提高篇)
下一篇:Oracle9i数据库设计指引全集二
|