oracle中如何执行包含动态SQL的存储过程?

Posted

技术标签:

【中文标题】oracle中如何执行包含动态SQL的存储过程?【英文标题】:How to execute stored procedures containing dynamic SQL in oracle? 【发布时间】:2013-06-07 06:48:40 【问题描述】:

我已经创建了以下过程

Create or replace procedure abcd
(
    tab_name in USER_TABLES.table_name%type
)
is
begin
execute immediate
'select * from'||tab_name;
end abcd;

程序被编译。

我正在尝试使用以下方法获取输出

select abcd('Table') from dual ;

我是动态 SQL 的新手,这似乎对我不起作用。我不断收到错误

[错误] 执行 (44:8): ORA-00904: "ABCD": 标识符无效

有人可以帮忙吗?

问候, 克什蒂杰

【问题讨论】:

嗨,我也试过 exec abcd('Table') ;我收到 [Error] Execution (44: 1): ORA-00923: FROM keyword not found where expected ORA-06512: at "HSBC_AML_CANADA.ABCD", line 6 ORA-06512: at line 1 复制:***.com/questions/2115423/… 【参考方案1】:

您的表名前缺少一个空格:

create or replace procedure abcd (tab_name in USER_TABLES.table_name%type )
is
begin
    execute immediate 'select * from '||tab_name;
end abcd;

这不起作用,因为您试图将其作为函数而不是过程来调用:

select abcd('Table') from dual ;

您的第二次尝试现在应该可以了:

exec abcd('Table');

... 但现在会得到一个不同的错误。在 PL/SQL 中,您必须选择某些内容。在这种情况下,您可能希望使用动态字符串打开一个游标并对结果执行一些操作。不过不太确定你的最终目标是什么。

在了解动态 SQL 的同时,您还应该阅读有关 SQL 注入的内容。

【讨论】:

【参考方案2】:

您不能对过程执行选择,仅当返回单个记录时,函数才会起作用。 使用

开始 A B C D(); 结尾; 或使用 执行关键字

在查询中的 from 后面也可以使用空格

【讨论】:

【参考方案3】:

它不会起作用。

当您调用 EXECUTE IMMEDIATE 时,sql 语句被发送到 SQL 引擎。没有结果被传回 PL/SQL。

编写“SELECT * FROM a_table”并不难,而且更安全。

【讨论】:

以上是关于oracle中如何执行包含动态SQL的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?

sql 存储过程如何动态拼接where后面的条件

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

PL_sql如何执行oracle存储过程

oracle存储过程