2017-08-10 9 views
0

私は(それはより複雑だが、コンセプトは、私は、動的SQLが必要なことである)このように、ストアドプロシージャを用意していますPl/sqlはINパラメータを ''の間に入れる必要がありますか?

PROCEDURE PROCTEST(
    P_TEST       IN  VARCHAR2, 
    P_RESULT      OUT PCK1.CURSOR 
); 

私がやろうとしているすべての値を使用している(のは「MyTestに」を言わせて)を選択します。

MYSELECT:='SELECT * FROM MYTABLETEST WHERE MYCOL='||P_RESULT||; 

問題は、私はこのエラーを取得することです:

ORA-00911: invalid character

私は私の選択を印刷するためならば、私は私が必要SELECT * FROM MYTABLETEST WHERE MYCOL=mytestないものを得る:

SELECT * FROM MYTABLETEST WHERE MYCOL='mytest' 

答えて

1

あなたは連結を含むべきです声明の中に「 '」をつけて引用符を付ける。 @FerdinandGasparによって

MYSELECT:='SELECT * FROM MYTABLETEST WHERE MYCOL='||''''||P_RESULT||''''; 
+1

:パラメータの数が既知である場合、好ましいアプローチは、SQLステートメントで(時には「バインド変数」と呼ばれる)パラメータを使用し、これ等のEXECUTE IMMEDIATE文の一部として、パラメータ値を渡すことですありがとう!このような単純なことは、そのような操作が必要であることは私には不思議に思えるようです。もし何か良いことがなければ答えを受け入れるつもりです。再度ありがとう –

+0

これは最も簡単な方法です。 :) –

+1

mycol = '' '|| p_result ||' '' '; '(またはもっと良い方法では、バインド変数を使用してください)なぜmyselect:=' select * from mytabletest? –

0

答えのバリエーションは、もう少し読みやすいかもしれません、以下、次のとおりです。

SQL_TEMPLATE := q'[ SELECT * FROM MYTABLETEST WHERE MYCOL = '{PARAM}' ]'; 
MYSELECT := Replace(sql_template, '{PARAM}', p_result); 

それは、この補間アプローチがSQL injection攻撃に対して脆弱であることを言及することが重要です。

MYSELECT := 'SELECT * FROM MYTABLETEST WHERE MYCOL = :param'; 
Execute Immediate myselect Using p_result; 
関連する問題