標籤:
在這裡我先說遇到的一個問題
在練習的例子中加入了標頭檔
#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