Oracle PL/SQL中存储过程参数在动态SQL中的正确使用咨询
你的Oracle动态SQL参数使用问题解答
兄弟,你这个存储过程里的动态SQL写法确实踩坑了!直接在字符串里写colValue的话,Oracle会把它当成表abc.table里的列名,而不是你传入的参数值,运行时肯定会报类似“标识符COLVALUE无效”的错误,完全达不到你想要的效果。
而且你问的:=colValue这种写法也不对——:=是PL/SQL里的赋值符号,放在动态SQL的字符串里,Oracle只会把它当成普通字符处理,根本不会识别成参数引用。
给你两种正确的写法,优先推荐第一种:
推荐:使用绑定变量(安全又高效)
这是Oracle动态SQL的标准写法,不仅能避免SQL注入风险,还能让数据库复用执行计划提升性能。写法如下:PROCEDURE Test (colValue IN VARCHAR2) IS vINS VARCHAR2(32000) := 'select * from abc.table where col10 = :1'; BEGIN EXECUTE IMMEDIATE vINS USING colValue; END;这里的
:1是占位符,USING子句会把你传入的colValue参数值绑定到这个占位符上,完美解决参数传递的问题。不推荐:字符串拼接(仅作了解)
如果你非要用字符串拼接的方式(强烈不建议,有SQL注入风险,还容易因为特殊字符报错),需要注意单引号的转义:PROCEDURE Test (colValue IN VARCHAR2) IS vINS VARCHAR2(32000) := 'select * from abc.table where col10 = ''' || colValue || ''''; BEGIN EXECUTE IMMEDIATE vINS; END;这里用两个单引号
''表示字符串里的一个单引号,把参数值拼进SQL语句里,但如果colValue里包含单引号(比如用户输入O'Neil),直接拼接会导致SQL语法错误,还可能被恶意注入攻击,所以尽量别用这种方式。
总结一下:别用直接写参数名或者:=的方式,老老实实使用绑定变量才是正确的选择!
内容的提问来源于stack exchange,提问作者4est
相关产品推荐
相关产品推荐

