PL / SQL ORA-00903:在立即执行期间无效的表名称

问题描述 投票:0回答:1

这是我的代码:

procedure test IS 
  tn varchar2(99);
  i number(6);
  cursor c1 is
    select tname
    from   tab
    where  tabtype='TABLE'
    and    tname NOT LIKE 'BIN%'
    order by tname;
begin
  open c1;
  loop
    fetch c1 into tn;
    exit when c1%notfound;
    sq3 := 'select count(*) from '||tn;
    EXECUTE IMMEDIATE sq3 INTO i;
    htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
  end loop;
  close c1;
end test;

执行后,我收到错误消息

Failed to execute target procedure
ORA-00903: invalid table name

对于此行“立即将sq3放入i;”

任何想法为什么?

提前感谢!

oracle plsql procedure dynamic-sql
1个回答
0
投票

错误不言自明:

您要计算其行数的表的名称之一无效。

您可以使用以下代码来捕获异常并确定表的名称:

procedure test
IS 
  tn varchar2(99);
  i number(6);
  cursor c1 is
    select tname
    from   tab
    where  tabtype='TABLE'
    and    tname NOT LIKE 'BIN%'
    order by tname;

  invalid_table_name EXCEPTION;
  PRAGMA EXCEPTION_INIT( invalid_table_name, -903 );
begin
  open c1;
  loop
    fetch c1 into tn;
    exit when c1%notfound;
    BEGIN
      sq3 := 'select count(*) from '||tn;
      EXECUTE IMMEDIATE sq3 INTO i;
      htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
    EXCEPTION
      WHEN invalid_table_name THEN
        DBMS_OUTPUT.PUT_LINE( 'Invalid Table Name: ' || tn );
    END;
  end loop;
  close c1;
end test;

您可能会发现表名无效,因为它区分大小写,并且您没有在EXECUTE IMMEDIATE语句中这样处理它。在这种情况下,您可以使用:

sq3 := 'select count(*) from "'||tn||'"';
© www.soinside.com 2019 - 2024. All rights reserved.