Oracle Prc C學習 二

來源:互聯網
上載者:User

標籤:

  1. 聲明一個遊標變數

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學習 二

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.