Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在oracle中执行包含动态SQL的存储过程?_Sql_Oracle - Fatal编程技术网

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

如何在oracle中执行包含动态SQL的存储过程?,sql,oracle,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

我创建了以下过程

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

表名前缺少一个空格:

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注入。

如果无法对过程执行select,则只有在返回单个记录时,函数才会工作。 使用

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

在查询中,也要在from之后使用空格

它将不起作用

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

编写“从表中选择”并没有那么难,也安全得多。

Hi,我也尝试过exec abcd(“表”);我正在执行[错误](44:1):ORA-00923:FROM关键字未找到预期的ORA-06512:在“HSBC\u AML\u CANADA.ABCD”第6行ORA-06512:在第1行重复: