我准备了这样的存储过程(它更复杂,但概念是我需要一个动态SQL):
PROCEDURE PROCTEST(
P_TEST IN VARCHAR2,
P_RESULT OUT PCK1.CURSOR
);
我要做的就是使用值(让我们说'mytest')进行选择。
MYSELECT:='SELECT * FROM MYTABLETEST WHERE MYCOL='||P_RESULT||;
问题是我收到了这个错误:
ORA-00911:无效字符
因为如果我打印我的选择,我得到SELECT * FROM MYTABLETEST WHERE MYCOL=mytest
而不是我需要的东西:
SELECT * FROM MYTABLETEST WHERE MYCOL='mytest'
答案 0 :(得分:0)
@FerdinandGaspar的答案的变体如下,可能更容易辨认:
SQL_TEMPLATE := q'[ SELECT * FROM MYTABLETEST WHERE MYCOL = '{PARAM}' ]';
MYSELECT := Replace(sql_template, '{PARAM}', p_result);
值得一提的是,这种插值方法容易受到SQL injection攻击。如果参数的数量是已知的,最好的方法是在SQL语句中使用参数(有时称为"绑定变量"),并将参数值作为EXECUTE IMMEDIATE语句的一部分传递,如下所示: / p>
MYSELECT := 'SELECT * FROM MYTABLETEST WHERE MYCOL = :param';
Execute Immediate myselect Using p_result;