11

実行前に SQL で使用されるバインド変数の正確な数がわからない Oracle で動的 SQL 実行を使用する必要があります。

EXECUTE IMMEDIATEどうにかして呼び出しで可変数のバインド変数を使用する方法はありますか?

具体的には、不明な SQL に1 つのパラメーターを渡す必要がありますが、そこで使用される頻度はわかりません。

私は何かを試しました

EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;

しかし、それはORA-01008: not all variables bound.

4

5 に答える 5

10

でこれを行うことはできませんEXECUTE IMMEDIATEDBMS_SQLただし、これは Oracle のパッケージを使用して行うことができます。データベース アプリケーション開発者ガイドEXECUTE IMMEDIATEには、使い慣れた とdbms_sqlメソッド の比較があります。このページには が記載DBMS_SQLされていますが、いくつかの例 (上記のリンク) を使用して開始する必要があります (例 1 は、任意の数のバインド変数を持つステートメントを実行する単純なケースです)。 DBMS_SQLコーディングの観点からははるかに面倒ですが、考えられることはほぼ何でもできます。

SQL で発生するバインド変数の複数のインスタンスが許可されます。ただし、バインド変数として使用されている名前を知っている必要があります (たとえば、あなたの場合は :var ) DBMS_SQL.BIND_VARIABLE

于 2009-06-17T19:52:31.833 に答える
7

WITHステートメントを使用して、この問題を回避することもできます。一般的には を使用するDBMS_SQL方が優れていますが、場合によってはこれがより簡単な方法です。

BEGIN
    EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;
于 2009-08-07T14:36:23.337 に答える
2

このAskTomのスレッドでは、この件について詳しく説明しています。

あなたの場合、1 つのパラメーターを渡すか、何も渡さない場合は、1 つのパラメーターを持つ 2 つのクエリを作成できます。これらのクエリの 1 つは、次のように使用されません (つまり、述語は常に true です)。

-- query1
SELECT * FROM DUAL WHERE dummy = :x;

-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;

述語が常に true であることをオプティマイザーが理解できるように、述語を改良することができます。

于 2009-06-17T16:03:50.877 に答える
1

具体的には、不明な SQL に 1 つのパラメーターを渡す必要がありますが、そこで使用される頻度はわかりません。

私は実際に数日前にまったく同じ問題に遭遇し、友人がEXECUTE IMMEDIATE.

これには、SQL ブロック自体ではなく、PLSQL ブロックの生成が含まれます。EXECUTE IMMEDIATEPLSQLコードのブロックで使用する場合、変数を位置だけでなく名前でバインドできます。

私の例/コードと、私自身の同様の質問/回答スレッドをチェックしてください:

于 2011-05-18T20:58:37.670 に答える