Pro*cダイナミックsql 2

2220 ワード

  • この方法は、非問合せ文を実行するためにのみ使用でき、非問合せ動的SQL文に入力ホスト変数プレースホルダを含めることができますが、プリコンパイル時に動的SQL文内のプレースホルダの数と入力ホスト変数のデータ型を決定する必要があります.  
  • ①.準備フェーズ:PREPARE文を呼び出し、実行する動的SQL文を準備します.この場合、Oracleは動的SQL文を構文解析し、参照するデータベース・オブジェクトなどを確認します.  
  • ②.実行フェーズ:EXECUTEコマンドを呼び出して準備した動的SQL文を実行します.  
  • この方法では、
  • でOracleを必要とせずに動的SQLが準備された後に複数回実行できます.
  • 実行ごとにSQL文を再解釈します.  
  • 例えば:
  • …   
  • <接続データベース>
  • strcpy(str_sql,“INSERT INTO test001 values (:K1,:K2,:K3)”);   
  • EXEC SQL PREPARE test FROM :str_sql;   
  • EXEC SQL EXECUTE test USING :uname, :uaddress,:usex;   
  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sqlca.h>
    void connect();
    void sql_err();
    
    void dynamic_sqltwo();
    
    void main()
    {
       EXEC SQL WHENEVER SQLERROR  DO sql_err();
       connect();
       dynamic_sqltwo();
       EXEC SQL COMMIT RELEASE;
    }
    
    void sql_err()
    {
     // printf("%.*s
    ",sqlca.sqlerrm.sqlerrml,,sqlca.sqlerrm.sqlerrmc); } void connect()/* - , server*/ { EXEC SQL BEGIN DECLARE SECTION; VARCHAR oraCN[30]; EXEC SQL END DECLARE SECTION; strcpy(oraCN.arr,"scott/Tiger@TEST_dist"); EXEC SQL CONNECT :oraCN; } void dynamic_sqltwo() { EXEC SQL BEGIN DECLARE SECTION; char name[10]; int newsalary; char control; EXEC SQL END DECLARE SECTION; for(;;) { printf("intput employee name: "); gets(name); printf("input employee salary: "); scanf("%d",&newsalary); getchar(); EXEC SQL PREPARE stat FROM 'UPDATE emp SET sal=:a WHERE upper(ename)=upper(:b)'; EXEC SQL EXECUTE stat USING :newsalary,:name; printf("continue? (Y/N)"); scanf("%c",&control); getchar(); if(control=='N'||control=='n') break; } }