在 PL/SQL 中引用动态 SQL 的标识符
Posted
技术标签:
【中文标题】在 PL/SQL 中引用动态 SQL 的标识符【英文标题】:Quoting identifiers for dynamic SQL in PL/SQL 【发布时间】:2010-10-22 18:44:45 【问题描述】:是否有 PL/SQL 函数或通用技术来引用非限定标识符(例如,mytable
)以用于动态构造的 SQL 查询?部分或完全限定标识符 (a.b@c
) 怎么样?
考虑这个人为的例子:
CREATE PROCEDURE by_the_numbers(COL_NAME VARCHAR, INTVAL INTEGER) IS
...
BEGIN
-- COL_NAME is interpolated into SQL string
-- INTVAL gets bound to :1
stmt := 'SELECT * FROM tbl WHERE ' || COL_NAME || ' = :1';
...
END
...我们不希望在 COL_NAME
中允许幼稚 SQL 注入(例如,值 '1=1 或 1')。
【问题讨论】:
有你想要做什么的例子吗? @OMG Ponies,这个例子说明了吗?基本上我想要一个相当于 perl DBI 的quote_identifier()
我的经验是不能使用 BIND 变量作为列名,因为它是 CHAR/VARCHAR 会自动用单引号括起来以防止 SQL 注入。
@OMG,对。标识符必须是插值(或多或少),所以我想在这样做之前引用它...
【参考方案1】:
有 dbms_assert:http://www.oracle-base.com/articles/10g/dbms_assert_10gR2.php 用于防止 sql 注入。
【讨论】:
以上是关于在 PL/SQL 中引用动态 SQL 的标识符的主要内容,如果未能解决你的问题,请参考以下文章