在 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 的标识符的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 函数返回类型整数:无效标识符

在 PL/SQL 中出现错误“PLS-00201:必须声明标识符‘JSON_VALUE’”

pl/sql 必须声明 PLS-00201 标识符

ORA-00904 PL/SQL 中的标识符无效

错误:PL/SQL:ORA-00904::标识符无效

必须声明 PL/SQL 标识符“字符串”