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

时间:2013-06-07 06:48:41

标签: sql oracle

我已经创建了以下程序

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”:标识符无效

有人可以帮忙吗?

此致 Kshitij

3 个答案:

答案 0 :(得分: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注入的信息。

答案 1 :(得分:0)

您无法对某个过程执行选择,只有单个记录返回时,该函数才会起作用。 使用

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

也可以在查询之后使用空格

答案 2 :(得分:0)

它无效。

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

写“SELECT * FROM a_table”并不那么难,也更安全。