2017-04-15 12 views
0

タスクの事前定義された特性を編集する関数を記述する必要があります。私はexecute immediateを使用していますが、私はこのエラーを取得しています:エラーの取得ORA-00933即時実行の実行

> Error report - 
ORA-00933: SQL command not properly ended 
ORA-06512: at "C##U1519.BEARBEITE", line 7 
ORA-06512: at line 2 
00933. 00000 - "SQL command not properly ended" 

これは

create or replace procedure bearbeite(Aufg_ID Aufgabe.Aufgaben_ID%TYPE, Eigenschaft VARCHAR2, Wert VARCHAR2) 
as 
    sql_query_string2 VARCHAR2(4000); 
begin 
    --überprüfen 
    sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = ' || Wert || ' where Aufgabe.Aufgaben_ID = ' || Aufg_ID; 
    EXECUTE IMMEDIATE sql_query_string2; 

exception 
    when no_data_found then 
     dbms_output.put_line('Kein Wert'); 
end; 


-- test 
set serveroutput on 
begin 
    bearbeite(1,'Ort','TH WILDAU'); 
end; 

私のコードで、私はそれを動作させるために何をすべき?事前

+0

エラーメッセージは何ですか?私たちはそれを推測することはできません。 –

答えて

1

にあなたが単一引用符... PL/SQLでは、エスケープする必要があるとクエリ文字列に「

sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = ''' || Wert || ''' where Aufgabe.Aufgaben_ID = ' || Aufg_ID;

+0

それを知らなかった、ありがとう! –

3

投棄値」になるとvarchar2引数を囲む必要があるおかげで危険です。最も広範に宣伝されている危険はSQLインジェクションですが、多くの場合(ユーザー入力にコントロールが既にあるかもしれません)には当てはまりません。より大きな問題は予期しない構文エラーです。複数の人が、クエリ文字列を生成するときに、O'Neilのような名前に遭遇しました。

パラメータの使用を強くお勧めします。

sql_query_string2 := 'UPDATE Aufgabe SET ' || Eigenschaft || ' = :1 where Aufgabe.Aufgaben_ID = :2'; 
EXECUTE IMMEDIATE sql_query_string2 USING Wert, Aufg_ID; 

これは、一重引用符を使用するかどうかを心配する必要がないということも意味します。

パラメータには番号を付けずに名前を付けることができます。

悲しいことに、テーブル名、スキーマ名、列名、関数、キーワードなどのSQL識別子にはパラメータを使用できません。したがって、列名は文字列に組み込む必要があります。