2

ORACLE 11g で SQL を使用して に挿入しtable1、同時に に挿入するストアド関数を起動しtable3ます。ストアド関数が起動していません。これは、ORACLE オプティマイザーがストアド関数が挿入に必要ではないことを認識しているため、table1それらを無視するためだと思いますか? オラクルがクエリを最適化しないように要求する方法はありますか、それともより良い解決策がありますか。サンプルコード:

INSERT INTO table1 (col1)
SELECT A.col1
FROM (SELECT col1, storedFunction(col2),storedFunction(col3),storedFunction(col4)
FROM table2) A  
4

3 に答える 3

2

ストアド プロシージャを返しNULLて、以下を使用できます。

INSERT INTO table1 (col1)
SELECT NVL( col1, storedProcedure(col2) )
FROM table2

NVL最初のパラメーターが null でない場合でも、常に両方のパラメーターを評価します。

このハックに満足できるかどうかはわかりませんが...

于 2012-07-18T14:17:37.337 に答える
1

SQL ソリューションは、サブクエリを一時テーブルに/*+ MATERIALIZE */し、サブクエリでヒントを使用して、格納された関数を Oracle に強制的に評価させることです。例えば

INSERT INTO table1 (col1)
WITH temp_table AS (/*+ MATERIALIZE */  SELECT col1, storedFunction(col2),storedFunction(col3),storedFunction(col4)
FROM table2) 
SELECT col1
FROM temp_table
于 2012-07-19T13:50:41.967 に答える
1

自律storedFunction型トランザクションとして機能し、1 億行を超える行を処理しているとすれば、パフォーマンスに深刻な問題が発生する可能性があります。可能であれば、この戦略全体を再考します。それをスクラップします。最初からやり直してください。

オプション1

bulk collectこれが不可能な場合は、フェッチを (制限付きで) 実行して and を取得col1し、各行の を明示的にcol2呼び出してからに入れるのが最善の策です。これにより、 からの読み取りおよび への書き込みの I/O が最小限に抑えられるはずです。あなたは本当に電話でパイパーを支払うつもりです。storedFunctioncol2bulk inserttable1table2table1storedFunction

オプション 2 必要な動作を持つ別の関数内に関数をラップします。タイプについては言及していませんが、VARCHAR2を想定しています。もちろん、必要に応じて調整できます。Oracle データベースが手元にないため、構文エラーをお許しください。

CREATE FUNCTION MYFUNC(col1 IN VARCHAR2, col2 IN VARCHAR2) RETURN VARCHAR2
AS
   v_dummy VARCHAR2(100);
BEGIN
  v_dummy := storedFunction(col2);   --Call stored function
  return col1;                       --return col 1 unchanged
END;

次に、次のように挿入を実行できます。

INSERT INTO table1 (col1)
SELECT MYFUNC(A.col1, A.col2)
FROM   table2 A;  
于 2012-07-18T15:32:44.600 に答える