0

Iamは、テーブルに挿入するためのexecute_immediateステートメントで使用する文字列を作成しようとしています。使用される列の1つはBLOB型です。'||'を使用しているIam 列を追加してSQLを構築する演算子。BLOB型は'||'では機能しないようです。サンプルコード(オリジナルではない)とエラーを参照してください

宣言する
    FIRST_NAME varchar2(10);
    PICTUREブロブ; --blobタイプ
    TEMP_STR varchar2(2000);
始める
    FIRST_NAME:='アルン';
    --BLOBが作成されます
    DBMS_LOB.CREATETEMPORARY(PICTURE、true);

-- next line works
insert into BLOB_TEST (PERSON_NAME,PHOTO) values (FIRST_NAME,PICTURE);

-- creating the string
TEMP_STR := 'insert into BLOB_TEST values (''' || first_name||''''||','||PICTURE||')';
-- just to view the string
DBMS_OUTPUT.PUT_LINE(TEMP_STR); 

/* code to be done */
-- execute immediate(temp_str); 
end;

エラー

エラーレポート: ORA-06550:行9、列17: PLS-00306:'||'の呼び出しで引数の数またはタイプが間違っています ORA-06550:行9、列5: PL / SQL:ステートメントは無視されます 06550. 00000-「行%s、列%s:\ n%s」 *原因:通常、PL/SQLコンパイルエラー。 *アクション:

My table BLOB_TEST is create table BLOB_TEST ( PERSON_NAME varchar2(20), PHOTO blob );

助けてください。私が欲しいのは、BLOB値をテーブルに挿入するために挿入ステートメントを動的に実行するオプションです。

4

1 に答える 1

2

動的 SQL でも、バインド変数を使用する必要があります。問題が解決しました。

SQL> CREATE TABLE blob_test (PERSON_NAME VARCHAR2(10), PHOTO BLOB);

Table created.

SQL> DECLARE
  2     FIRST_NAME VARCHAR2(10);
  3     PICTURE    BLOB; -- blob type
  4     TEMP_STR   VARCHAR2(2000);
  5  BEGIN
  6     FIRST_NAME := 'Arun';
  7     DBMS_LOB.CREATETEMPORARY(PICTURE, TRUE);
  8     INSERT INTO BLOB_TEST (PERSON_NAME, PHOTO) VALUES (FIRST_NAME, PICTURE);
  9     TEMP_STR := 'insert into BLOB_TEST values (:person,:myblob)';
 10     execute immediate(temp_str) using first_name, picture;
 11  END;
 12  /

PL/SQL procedure successfully completed.

バインド変数を使用しないことは非常にまれです。バインド変数を使用すると、次のことが保証されます。

  1. クエリが別のパラメーター セットで再度実行される場合、オプティマイザー プランを再利用できます。
  2. コードが SQL インジェクションの影響を受けない
于 2012-01-13T09:14:28.143 に答える