变量不被替换(学习动态PL / SQL)

时间:2017-11-18 10:39:47

标签: oracle plsql oracle11g

下面的代码返回错误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'即使在范围内声明之后也不能被视为变量。或者为什么不期望变量的原因是什么?

2 个答案:

答案 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

  •   

Dynamic SQL

答案 1 :(得分:-1)

是的,正如你所说oracle pl / sql语法不允许这样,通过变量传递表名。正如您所说,只能通过动态sql执行并立即执行:

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