2

我创建了以下过程

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

4

3 回答 3

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 注入的内容。

于 2013-06-07T07:00:19.880 回答
0

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

开始 abcd(); 结尾; 或使用执行关键字

还在查询中的 from 之后使用空格

于 2013-06-07T07:03:57.740 回答
0

不起作用。

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

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

于 2013-06-07T08:32:34.153 回答