標籤:
聲明一個遊標變數
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. 這樣我就再編譯成可執行檔,一執行,還是那個不能從迴圈中退出的問題,還沒有解決,
解決了,再回來記錄下來問題解決辦法。
Oracle Prc C學習 二