2012-01-22 9 views
0

このコードにカーソルを挿入するとどのようにパフォーマンスが向上するのですか? データをフェッチするために動的なplsqlを使用する必要がありますが、INSERTを最適な方法で改善する方法はわかりません。バルクインサートのような? 可能であれば、コード例でお知らせください。挿入カーソルのパフォーマンスが向上しますか?

//これは私がcur_handleを使用する方法である:

cur_HANDLE integer; 
cur_HANDLE := dbms_sql.open_cursor; 
DBMS_SQL.PARSE(cur_HANDLE, W_STMT, DBMS_SQL.NATIVE); 
DBMS_SQL.DESCRIBE_COLUMNS2(cur_HANDLE, W_NO_OF_COLS, W_DESC_TAB); 

LOOP 
-- Fetch a row 
IF DBMS_SQL.FETCH_ROWS(cur_HANDLE) > 0 THEN 
    DBMS_SQL.column_value(cur_HANDLE, 9, cont_ID); 
    DBMS_SQL.COLUMN_VALUE(cur_HANDLE, 3, proj_NR);  
ELSE 
    EXIT; 
END IF; 

    Insert into w_Contracts values(counter, cont_ID, proj_NR); 
counter := counter + 1; 
END LOOP; 
+0

なぜカーソルに動的SQLを使用する必要があると思いますか?私たちがあなたに役立つことを望むなら、ユースケースを説明する必要があります。 – APC

+0

Becouse selectステートメントは、ユーザーがより詳細な検索を含むように選択してからselectステートメントが変更され、結果が最終的に異なって見える場合など、Webサイトから組み立てられます。アプリケーション全体は、dinamic plsqlコード上に構築されたWebサイトです。 – Haris

答えて

1

あなたはむしろ行ずつ挿入するよりも、セット可能な限りでデータベースの操作を行う必要があります。あなたは何であるかCUR_HANDLE私たちに教えていないので、私は本当にこれを書き換えることはできませんが、おそらくのような何かをする必要があります。

INSERT INTO w_contracts 
SELECT ROWNUM, cont_id, proj_nr 
    FROM (... some table or joined tables or whatever...) 

けれども、あなたの最初の値は、主キーがあり、それはおそらく良いだろう場合それをシーケンスから割り当てます。 v_stmtは、有効なSQLが含まれている場合

FORALL i in contracts_tab.first .. contracts_tab.last 
    INSERT INTO w_contracts VALUES contracts_tab(i); 

解決法2):あなたがループ内でPL/SQLの配列を移入してからちょうどループの後に使用して1つのステップで全体の配列を挿入することができます

+0

不足している情報については残念です。cur_handleの使い方は次のとおりです。 cur_HANDLE integer; - 宣言 cur_HANDLE:= dbms_sql.open_cursor; DBMS_SQL.PARSE(cur_HANDLE、W_STMT、DBMS_SQL.NATIVE); DBMS_SQL.DESCRIBE_COLUMNS2(cur_HANDLE、W_NO_OF_COLS、W_DESC_TAB); – Haris

+0

しかし、カーソルのselect文は何ですか? – eaolson

+0

W_STMTは、ステートメント変数の名前です。 – Haris

1

ソリューション1)声明ユーザーは に選択した場合は、直接「select文がウェブサイトから組み立てられる

EXECUTE IMMEDIATE 'INSERT INTO w_contracts (counter, cont_id, proj_nr) 
    SELECT rownum, 9, 3 FROM ('||v_stmt||')'; 
+0

既存のループの内部?私はそれがフェッチするすべての行の挿入を行うので、それは全体の操作が遅くなることが恐れています! – Haris

+0

ループ内にソリューション2を試しましたが、何も起こりません。 – Haris

0

、EXを使用してテーブルにデータを挿入することができますが、その後select文が変更され、より詳細な検索を含めます最終的に結果が異なって見えます。 アプリケーション全体は、動のPLSQLコード上に構築ウェブ サイトです。」

それはSQLインジェクションにデータベースをオープンしますので、これは、危険な命題である。これは、悪い人たちが展開するあなたのパラメーターを破壊するシナリオでありますユーザーが入力を検証するためにDBMS_ASSERTを使用する必要があります。Find out more

もちろん、ユーザーがSQL文字列全体を渡すことを許可しているW_STMTの建設に関する情報)、すべての賭けは無効です。DBMS_ASSERTはあなたに手伝ってくれません。

あなたは私たちが実際に必要な追加情報を提供するために失敗したとしてとにかく、私はあなたのためにそれを綴る聞かせてください。

  • SELECTステートメントが常に同じテーブル名から同じ列名を持つことになりますかユーザーはその2つを変更できますか?
  • あなたはいつも第3と第9列に興味がありますか?
  • W_STMT文字列はどのように組み立てられていますか?あなたはその投影についてどれだけのコントロールを持っていますか?
関連する問題