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创建序列为何会遇到权限不足的问题呢?
Oracle [存储过程] 执行动态拼接SQL语句并返回结果??