Oracle Prc C學習 之 Oracle動態SQL

來源:互聯網
上載者:User

標籤:

  1. 在這裡我先說遇到的一個問題

在練習的例子中加入了標頭檔

#include <oraca.h>

然後我怎麼編譯都不行,一直說找不到oraca.h

然後我把這個改成了

EXEC SQL INCLUDE oraca;

這樣就順利的編譯過去了。


第一種動態SQL語句:無宿主變數的非查詢語句

應用程式接收外界輸入構造SQL 陳述式到一個字串,然後調用
EXECUTE IMMEDIATE 命令執行這個SQL 陳述式。這種SQL 陳述式不能為SELECT 語句,不
能包含輸入變數的預留位置。

5.pc#include <stdio.h>#include <string.h>
EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE oraca;EXEC ORACLE OPTION(ORACA=YES);EXEC ORACLE OPTION(RELEASE_CURSOR=YES);
int main(int argc, char *argv[]){EXEC SQL BEGIN DECLARE SECTION;    char *username = "scott";    char *passwd = "xx";    char *dynstmt1;    char dynstmt2[10];    VARCHAR dynstmt3[80];    char dynstmt4[80];EXEC SQL END DECLARE SECTION;
    oraca.orastxtf = ORASTFERR;
    EXEC SQL CONNECT :username IDENTIFIED BY :passwd;    puts("CREATE TABLE dyn1 (col1 VARCHAR2(4))");    EXEC SQL EXECUTE IMMEDIATE        "CREATE TABLE dyn1 (col1 VARCHAR2(4))";
    dynstmt1 = "INSERT INTO dyn1 VALUES(‘TEST‘)";    puts(dynstmt1);    EXEC SQL EXECUTE IMMEDIATE :dynstmt1;
    strncpy(dynstmt2, "COMMIT", 10);    printf("%.10s\n", dynstmt2);    EXEC SQL EXECUTE IMMEDIATE :dynstmt2;
    EXEC SQL COMMIT;
    /*這裡我自己又完全輸入一個 DROP TABLE dyn1 這個字串,來試試*/    gets(dynstmt4);    EXEC SQL EXECUTE IMMEDIATE :dynstmt4;    EXEC SQL COMMIT WORK RELEASE;
    return 0;}



第二種:已知輸入變數個數的非查詢語句

應用程式接受或組建一個SQL 陳述式,並通過PREPARE 和EXECUTE 語
句執行這個SQL。不能是查詢語句。為輸入宿主變數準備的預留位置數目和輸入宿主變數的
類型必須已知

6.pc#include <stdio.h>#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;#define USERNAME "scott"#define PASSWD "xx"
EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE oraca;EXEC ORACLE OPTION(ORACA=YES);char *username = USERNAME;char *passwd = PASSWD;VARCHAR dynstmt[80];int empno = 1234;int deptno1 = 20;int deptno2 = 30;EXEC SQL END DECLARE SECTION;
int main(int argc, char *argv[]){    oraca.orastxtf = ORASTFERR;
    EXEC SQL CONNECT :username IDENTIFIED BY :passwd;
    strcpy(dynstmt.arr ,"INSERT INTO EMP (EMPNO, DEPTNO) VALUES (:v1, :v2)");    dynstmt.len = strlen(dynstmt.arr);
    puts((char *)dynstmt.arr);    printf("v1 = %d, v2 = %d\n", empno, deptno1);    EXEC SQL PREPARE insert_sql FROM :dynstmt;    EXEC SQL EXECUTE insert_sql USING :empno, :deptno1;    EXEC SQL COMMIT;
    empno ++;    EXEC SQL EXECUTE insert_sql USING :empno, :deptno2;    printf("v1 = %d, v2 = %d\n", empno, deptno2);    EXEC SQL COMMIT;
    strcpy(dynstmt.arr, "DELETE FROM EMP WHERE EMPNO = :v1");    dynstmt.len = strlen(dynstmt.arr);/* 這裡我還是通過從終端輸入一個值來執行 */      char temp[10];    gets(temp);    empno = atoi(temp);
    EXEC SQL PREPARE delete_sql FROM :dynstmt;    EXEC SQL EXECUTE delete_sql USING :empno;    EXEC SQL COMMIT WORK RELEASE;
    return 0;}

這個就是語句中帶有宿主變數的,也就是說,我們一開始不知道要刪除哪個,後來通過別的渠道給定要刪除的這個條件。


第三種: 通過接受或構建SQL 陳述式,用DELCARE、PREPARE 和OPEN、FETCH、CLOSE 語句執行動態查詢SQL 陳述式,

並訪問查詢結構。
適用於已知 SELECT 查詢語句查詢的各列、列類型、輸入宿主變數數目、輸入宿主變
量類型的情況

7.pc  #include <stdio.h>#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE oraca;EXEC ORACLE OPTION(ORACA=YES);
#define USERNAME "scott"#define PASSWD "xx"
char *username = USERNAME;char *passwd = PASSWD;VARCHAR dynstmt[80];VARCHAR ename[10];
EXEC SQL END DECLARE SECTION;
int main(int argc, char *argv[]){    EXEC SQL BEGIN DECLARE SECTION;    int deptno = 10;    EXEC SQL END DECLARE SECTION;
    oraca.orastxtf = ORASTFERR;
    EXEC SQL CONNECT :username IDENTIFIED BY :passwd;
    strcpy(dynstmt.arr, "SELECT ename FROM EMP WHERE deptno = :v1");    dynstmt.len = strlen(dynstmt.arr);
    EXEC SQL PREPARE select_sql FROM :dynstmt;    EXEC SQL DECLARE select_cur CURSOR FOR select_sql;  /*自己輸入要找的條件來尋找*/    char temp[10];    gets(temp);    deptno = atoi(temp);     EXEC SQL OPEN select_cur USING :deptno;
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1) {        EXEC SQL FETCH select_cur INTO :ename;        ename.arr[ename.len] = ‘\0‘;        puts((char *)ename.arr);    }    printf("\nQuery returned %d row %s.\n\n", sqlca.sqlerrd[2],            (sqlca.sqlerrd[2] == 1)?"":"s");
    EXEC SQL CLOSE select_cur;    EXEC SQL COMMIT WORK RELEASE;
    return 0;}























Oracle Prc C學習 之 Oracle動態SQL

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.