- 声明一个游标变量
EXEC SQL BEGIN DECLARE SECTION;
SQL_CURSOR emp_cursor;
sql_cursor dept_cursor;
EXEC SQL END DECLARE SECTION;
这样定义后,如果使用前先要分配资源用ALLOCATE
EXEC SQL ALLOCATE :emp_cursor;
EXEC SQL ALLOCATE :dept_cursor;
使用完后,要关闭
EXEC SQL CLOSE :emp_cursor;
EXEC SQL CLOSE :dept_cursor;
这个关闭只是对应游标那个OPEN操作,这里没有释放资源的,如果要释放资源
EXEC SQL FREE :emp_cursor;
EXEC SQL FREE :dept_cursor;
2. 记录一个错误
我在使用PL/SQL来创建一个包的时候,在包规范中加上了AUTHID CURRENT_USER,
然后在创建包体的时候,又加上AUTHID CURRENT_USER,
然后一直提醒我有一个警告关于这个AUTHID的,然后我把包体里的去掉就OK了。
3. 然后我按照书的例子写了一下,也遇到了编译问题,还是运行的那个不能结束的问题
2.pc #include <stdio.h> #include <stdlib.h> #include <sqlca.h>
void sql_error(char *msg) { exit(1); }
int main(int argc, char *argv[]) { char temp[32];
EXEC SQL BEGIN DECLARE SECTION; char *uid = "scott/xx"; SQL_CURSOR emp_cursor; int dept_num; struct { int emp_num; char emp_name[11]; char job[10]; int manager; char hire_date[10]; float salary; float commission; int dept_num; } emp_info;
struct { short emp_num_ind; short emp_name_ind; short job_ind; short manager_ind; short hire_date_ind; short salary_ind; short commission_ind; short dept_num_ind; } emp_info_ind;
EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error"); EXEC SQL CONNECT :uid; EXEC SQL ALLOCATE :emp_cursor; EXEC SQL WHENEVER NOT FOUND DO break;
while (1) { printf("\nEnter department number(0 to quit): "); gets(temp); dept_num = atoi(temp); if (dept_num <= 0) break; EXEC SQL EXECUTE BEGIN emp_demo_pkg.open_cur(:emp_cursor, :dept_num); END; END-EXEC;
printf("\nFor department %d--\n", dept_num); printf("ENAME SAL COMM\n"); printf("----------------\n"); while (1) { EXEC SQL FETCH :emp_cursor INTO :emp_info INDICATOR :emp_info_ind; printf("%s", emp_info.emp_name); printf("%8.2f", emp_info.salary); if (emp_info_ind.commission_ind != 0) printf("NULL\n"); else printf("%8.2f\n", emp_info.commission); } }
EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL CLOSE :emp_cursor; EXEC SQL ROLLBACK WORK RELEASE;
return 0; }
我在用proc编译的时候遇到这种错误
1. EXEC SQL EXECUTE
.................1
PCC-S-02345, SQLCHECK=SEMANTICS must be given when embedded PL/SQL blocks are used
这个就是在程序中有PL/SQL块的时候要加上一个编译选项
SQLCHECK=SEMANTICS 或者=FULL,这我还没有研究有什么区别
这样以后又遇到另一个问题,在程序中使用了scott用户下的package,但是一编译却找不到,说要声明,
然后在编译选项中加上
userid=scott/xx 这个是我的scott用户的名和密码,这个我觉得是他在编译的时候要先到用户下找一下这个package
要不然它怎么知道有没有呢。
然后我使用的完整的编译命令就是
proc PARSE=NONE CODE=KR_C LINE=YES INAME=2.pc MODE=ORACLE DBMS=V8 UNSAFE_NULL=YES SQLCHECK=FULL userid=scott/xx
2. 这样我就再编译成可执行文件,一执行,还是那个不能从循环中退出的问题,还没有解决,
解决了,再回来记录下来问题解决办法。