PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效

Posted

技术标签:

【中文标题】PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效【英文标题】:PL/SQL ORA-00903: invalid table name during EXECUTE IMMEDIATE 【发布时间】:2020-01-14 23:22:28 【问题描述】:

这是我的代码:

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 INTO i;”

有什么想法吗?

提前致谢!

【问题讨论】:

【参考方案1】:

错误是不言自明的:

您尝试计算行数的表的名称之一无效。

您可以使用以下代码捕获异常并确定表的名称(您还需要声明sq3变量):

procedure test
IS
  sq3 CLOB;
  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||'"';

db<>fiddle

【讨论】:

以上是关于PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00903,ORA-06512,同时计算所有用户表的行数(动态 sql)

ORA-00903: 无效的表名

pyspark 读取格式 jdbc 生成 ORA-00903: invalid table name 错误

链接服务器“FDMEE_SIMPHONY”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“ORA-00903:无效表名”

通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值

在 PL\SQL 块中使用 EXECUTE IMMEDIATE