2017-11-18 124 views
0

下面的代码返回错误ORA-00942: table or view does not exist,我想可能是因为PL/SQL运行时引擎(或者我不知道是什么)试图将table_in作为表处理,但是为什么会这样做,我已经将table_in声明为变量。变量未被替换(学习动态PL/SQL)

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

这是因为你的SELECT语句的 –

+0

PL/SQL不只是胡乱替代恰好匹配任意文本参数名称。在参数化游标的上下文中,它只评估绑定变量。 –

回答

2

我明白EXECUTE IMMEDIATE会解决这个目的。我所 试图得到的是为什么是必要的,什么是错与当前 声明“table_in”不能为变量,即使在 范围被宣布后处理。

作为每Oracle文档:Static SQL

PL/SQL静态SQL语句可以具有PL/SQL标识符无论其SQL对方可以具有用于绑定变量的占位符。在PL/SQL标识必须标识变量或正式parameter.To使用PL/SQL标识符的表名,列名,依此类推,使用EXECUTE IMMEDIATE语句

在PL/SQL,你需要动态SQL运行时:

  • SQL其文本是在编译时

    例如,包括标识符是未知在编译时(如表名)SELECT语句的或未知的 其中的一个WHERE子句的数量子句在编译时是未知的。不支持静态SQL

  • SQL

Dynamic SQL

+0

_SQL其文本是在编译时未知._帮助 –

-1

是的,正如你所说的oracle pl/sql语法不允许的那样,通过变量传递表名。正如你也说你只能通过动态SQL完成,并可直接:

execute immediate 'select count(*) from ' || table_in 
into l_return; 
+0

'table_in'是一个存储表格名称的变量。我是tryong来统计表中的总行数。 –