PLSQL 中的动态查询错误

Posted

技术标签:

【中文标题】PLSQL 中的动态查询错误【英文标题】:Dynamic Query Error in PLSQL 【发布时间】:2015-07-22 08:01:16 【问题描述】:

我正在尝试执行此过程:

CREATE OR REPLACE PROCEDURE SP_DYNAMIC 
AS
  tbl_list VARCHAR2(2000);
  DBLINK   VARCHAR2(100);
  V_SQL    VARCHAR2(1000);
BEGIN
  DBLINK := 'SOME_LINK';
  V_SQL := 'SELECT table_name,table_owner FROM dba_tab_modifications@:DB_LINK';

  EXECUTE IMMEDIATE V_SQL USING DBLINK;

  COMMIT;

  Dbms_Output.PUT_LINE (TBL_LIST);
END;

但是当我执行存储过程时,我得到了错误:

ORA-01729: database link name expected
ORA-06512: at "SYSTEM.SP_DYNAMIC"
ORA-06512: at line 2

有人可以帮我解决我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

它不起作用的原因是您不能使用绑定变量作为 dblink。运行以下命令时会出现相同的错误:

select * from dual@:dblink;

如果您绝对必须使用动态 sql,则必须将 dblink 名称连接到语句中 - 但您必须知道您现在可以使用 SQL 注入:

V_SQL := 'SELECT table_name,table_owner FROM dba_tab_modifications@'||DB_LINK;

【讨论】:

为了这个答案......您可以在 dba_tab_modifications@'||DB_LINK; 的结果上使用 DMBS_ASSERT.QUALIFIED_SQL_NAME; " 字符串的一部分,以尽量减少 sql 注入漏洞 谢谢,@James - 这是我不知道的事情。

以上是关于PLSQL 中的动态查询错误的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL - 如何计算动态查询返回的列数[重复]

PLSQL - 游标不能在动态 sql 中使用

在表中动态记录 PLSql 语句

PLSQL:在存储过程中使用动态查询时不显示输出

游标 PLSQL 中的动态列名

动态 PLSQL 中的错误绑定变量