2

私は最近、Pro*Cを使用して次のようにOracleデータベースにアクセスするようにプログラムしました。

cmd[128];
dpc_set_sqlca(&sqlca);
strcpy(cmd,"EXECUTE IMMEDIATE");
dpc_exec_immediate(sql_string);
SQLCODE = sqlca.sqlcode;

SQLが正常に実行されたかどうかを知る方法は?

たとえば、OracleDBにテーブルが存在するかどうかを知る方法はありますか?INSERTステートメントが正常に実行されたかどうかを知る方法は?

4

1 に答える 1

3

まず、Pro * Cでは、SQLステートメントは、次のEXEC SQLようなディレクティブを使用して直接実行できます。

EXEC SQL INSERT INTO.... VALUES...

他のすべてのSQLステートメントも同じ方法で実行できます。すべてのPro*Cは;SQLCA.Hのようなヘッダーファイルを使用します。EXEC SQL INCLUDE SQLCA.Hこの行は、プログラムに解釈する必要のあるSQLステートメントがあることをPro*Cプリコンパイラーに通知します。

動的SQLは、次のようにPro*Cでも実行できます。

char *cmd = "INSERT INTO emp VALUES(1234, 'jon', 3)";
EXEC SQL PREPARE q FROM :cmd;
EXEC SQL EXECUTE q;

または

char cmd[255] = "TRUNCATE TABLE tab_name";
EXEC SQL EXECUTE IMMEDIATE :cmd;

**:記号に注意してください。これは、変数がSQLエンジンへのバインド変数であることを示します。

次に、例外処理について説明します。以下は、Pro*CでSQLエラーを処理するために使用できるいくつかの例です-

  EXEC SQL INSERT INTO .... VALUES...;
  if SQL_ERROR_FOUND  //Exception Handling starts
  {
       sprintf(err_data,"INSERT/SELECT");                  
       //write error to log file, use SQLCODE to see what particular error happened
       return(-1);
  }

カーソルを開く-

 EXEC SQL OPEN c_cursor;
 if SQL_ERROR_FOUND   //Exception Handling starts
 {
    sprintf(err_data,"CURSOR FETCH: cursor=c_item");
    //write error to log file
    return(-1);
 }
 else if NO_DATA_FOUND
 {//do something
 }

または動的SQLを使用-

 EXEC SQL EXECUTE IMMEDIATE :cmd;
  if SQL_ERROR_FOUND
  {
        sprintf(err_data,"EXECUTE DYNAMIC STATEMENT %s", cmd); 
        //write error to log file 
        return(FATAL);
  }

など...例外/エラー処理は、エラーを処理if..elseする対象のすぐ下にEXEC SQL <statement>ある必要があることを忘れないでください。

SQLCODE (sqlca.sqlcode)最も一般的に使用されるエラーコードです。SQLCA.Hプログラムの先頭で、できればasを含めた直後にlongとして宣言されlong SQLCODE;ます。SQLCODEは、すべてのSQLステートメントの後にOracleによって入力され、Oracleサーバーのエラー番号を保持します。このコードは、エラー処理とロギングの目的にも使用できます。

于 2012-10-17T15:48:29.637 に答える