如何在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行重复: