我已经创建了以下程序
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
答案 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”并不那么难,也更安全。