【问题标题】:How to execute stored procedures containing dynamic SQL in oracle?oracle中如何执行包含动态SQL的存储过程?
【发布时间】: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

标签: sql oracle


【解决方案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”并不难,而且更安全。

      【讨论】:

        猜你喜欢
        • 2015-04-01
        • 1970-01-01
        • 2011-11-07
        • 2014-12-07
        • 2010-12-23
        • 2019-02-05
        • 2021-07-06
        • 1970-01-01
        • 2012-09-04
        相关资源
        最近更新 更多