0

次の PRO*C コードで、私の間違いを特定できる人はいますか? これをコンパイルできません:

int v1 = 5096;
int v2 = 8110;
int v3 = 8111;
int v4 = -1;
char stmt[6000];

strcpy(stmt, " MERGE INTO LDX_STYLE_MOVEMENTS ssd  USING (SELECT :1 pk from dual) ssd_pk   ON (ssd.style_movements_pk = ssd_pk.pk)  WHEN NOT MATCHED THEN insert (style_movements_pk, style, from_subclass, to_subclass, reclassified_date, change_type_fk) values(LDX_STYLE_MOVEMENTS_SEQ.nextval , null, :2, :3, null, :4 )");   

EXEC SQL execute immediate  :stmt using :v1, :v2, :v3, :v4;
4

1 に答える 1

2

EXECUTE IMMEDIATE(動的 SQL メソッド 1USING ) は句をサポートしていません。

代わりに準備して実行できます (動的 SQL メソッド 2を使用):

EXEC SQL PREPARE ora_stmt FROM :stmt;
EXEC SQL EXECUTE stmt USING :v1, :v2, :v3, :v4;

これを動的に行う必要はまったくないように見えますが、動的に行うことを選択した場合は、適切な方法を使用する必要があります。

ドキュメントの詳細:

方法 1 は、EXECUTE IMMEDIATE コマンドを使用して SQL ステートメントを解析し、すぐに実行します。コマンドの後には、実行する SQL ステートメントを含む文字列 (ホスト変数またはリテラル) が続きます。これはクエリではありません。

EXECUTE IMMEDIATE ステートメントの構文は次のとおりです。

EXEC SQL EXECUTE IMMEDIATE { :host_string | string_literal };

...

方法 2 では、SQL ステートメントに入力ホスト変数と標識変数のプレースホルダーを含めることができます...

PREPARE ステートメントの構文は次のとおりです。

EXEC SQL PREPARE statement_name 
    FROM { :host_string | string_literal }; 

PREPARE は SQL ステートメントを解析し、名前を付けます。

statement_name は、プリコンパイラによって使用される識別子であり、ホスト変数またはプログラム変数ではないため、宣言セクションで宣言しないでください。これは、EXECUTE する準備済みステートメントを指定するだけです。

EXECUTE ステートメントの構文は次のとおりです。

EXEC SQL EXECUTE statement_name [USING host_variable_list];

ここで、host_variable_list は次の構文を表します。

:host_variable1[:indicator1] [, host_variable2[:indicator2], ...] 

EXECUTE は、各入力ホスト変数に指定された値を使用して、解析された SQL ステートメントを実行します。

于 2015-05-13T11:32:14.193 に答える