下面的代码返回错误ORA-00942: table or view does not exist
,我想可能是因为PL / SQL运行时引擎(或者我不知道的是什么)试图将table_in
视为表,但为什么会这样这样做,我已经table_in
声明为变量。
ex26011601
表存在同一模式中的值。
set serveroutput on
declare
function tabcount (table_in in varchar2)
return pls_integer
is
l_return pls_integer;
begin
select count(*) into l_return from table_in;
return l_return;
end;
begin
dbms_output.put_line(tabcount('ex26011601'));
end;
我理解EXECUTE IMMEDIATE
会解决目的。我想要得到的是为什么它是必要的,并且当前声明的错误是'table_in'即使在范围内声明之后也不能被视为变量。或者为什么不期望变量的原因是什么?
答案 0 :(得分:2)
我理解EXECUTE IMMEDIATE会解决目的。我是什么 试图获得是为什么它是必要的和当前的错误 陈述' table_in'即使在之后也不能被视为变量 在范围内宣布。
根据oracle文档:Static SQL
PL / SQL静态SQL语句可以具有PL / SQL标识符,只要其SQL副本可以具有绑定变量的占位符。 PL / SQL标识符必须标识变量或形式参数。要对表名,列名等使用PL / SQL标识符,请使用EXECUTE IMMEDIATE语句
在PL / SQL中,您需要在以下时间运行动态SQL:
在编译时文本未知的SQL
例如,SELECT语句包含编译时未知的标识符(例如表名)或WHERE子句 其中子条款的数量在编译时是未知的。
不支持静态SQL的SQL
答案 1 :(得分:-1)
是的,正如你所说oracle pl / sql语法不允许这样,通过变量传递表名。正如您所说,只能通过动态sql执行并立即执行:
execute immediate 'select count(*) from ' || table_in
into l_return;