-2

動的更新SQLを生成して実行できるacプログラムを生成する必要があります。テーブル名、更新する列の数、および where 句の列は実行時にのみ認識されるため、プログラムを 2 つの関数に分割します。

1) CheckTableExists - ユーザーが提供したテーブルがデータベースに存在するかどうかを確認します。 実装に成功しました。

2) UpdateFunc - ユーザーが提供したデータから SQL 文字列を生成し
、クエリを実行します。

2 番目の関数で問題が発生しています。ユーザーから更新される列、名前、および値は受け入れません。次に、for ループを使用して、名前と値を SQL 文字列に追加します。

sqlstring = タブ名を更新 set colname = colval,colname = colval where

次に、where 句のデータを受け入れて、それを文字列に追加します。したがって、私の最終的な文字列は次のとおりです。

sqlstring = タブ名を更新 set colname = colval,colname = colval where wcolname = wcolval

しかし、それを実行するとプログラムがハングし
ます。

4

1 に答える 1

2

strSQLバインド用のプレースホルダーのない有効な SQL ステートメントになります。これは、数値および varchar2 変数を使用するクエリに適しています。バイナリの場合、Oracle で bin2hex() や hex2bin() などの関数を実装する必要がある場合があります。

次のような単純な関数:

int Exec_Query(sql_context sqlCtx, char *strSQL)
{

//    struct sqlca sqlca;

    /* Sanity checks for sqlCtx and strSQL */

    EXEC SQL WHENEVER SQLERROR GOTO QueryErr;  

    /* Set the context */
    EXEC SQL CONTEXT USE :sqlCtx;  

    /* Execute the query */
    EXEC SQL EXECUTE IMMEDIATE :strSQL; 

    EXEC SQL COMMIT; 

    return 0;

QueryErr:
    /* printf("Err: Failure in Executing Query\n"); */
    /* printf("Debug: <%s>",sqlca.sqlerrm.sqlerrmc); */
    return -1;
}

Pro*Cコンパイラを介して、作業用のCファイルが得られます。

于 2013-02-02T08:01:57.580 に答える