【问题标题】:Receiving error right parenthesis missing error which executing an PL/SQL block接收错误右括号缺少执行 PL/SQL 块的错误
【发布时间】:2019-01-03 03:52:04
【问题描述】:

在编写 PL/SQL 块时,我收到如下所示的错误。请告诉我这个错误的原因?

DECLARE
    TYPE TABLE_NAME IS VARRAY(17) OF VARCHAR(255);
    TABLENAME TABLE_NAME;
    TOTAL INTEGER;
BEGIN
  TABLENAME := TABLE_NAME ('FA_AS_ASSIGNMENTS','FA_PE_PHONES' );
  TOTAL     := TABLENAME.COUNT;
  FOR i IN 1 .. TOTAL
  LOOP
    INSERT
    INTO CUSTOM_ODILOAD_TABLE_COUNT
      (
        TABLE_NAME,
        ROW_COUNT
      )
      VALUES
      (
        TABLENAME(i),
        (SELECT COUNT(*) FROM TABLENAME(i)
        )
      );

  END LOOP;
END;

错误:

ORA-06550:第 19 行,第 40 列:PL/SQL:ORA-00907:缺少右括号
ORA-06550:第 10 行,第 5 列:PL/SQL:SQL 语句被忽略 06550.00000 -
“第 %s 行,第 %s 列:\n%s”
*原因:通常是 PL/SQL 编译错误。
*Action:匿名块完成

【问题讨论】:

  • 错误原因:SQL中不允许动态表名。
  • 以下是收到的错误:错误报告:ORA-06550:第 19 行,第 40 列:PL/SQL:ORA-00907:缺少右括号 ORA-06550:第 10 行,第 5 列:PL/ SQL:SQL 语句忽略 06550。00000 - “行 %s,列 %s:\n%s” *原因:通常是 PL/SQL 编译错误。 *操作:匿名块完成

标签: oracle plsql


【解决方案1】:

静态查询不能有动态表名(即表名不能参数化):

DECLARE
TYPE TABLE_NAME IS VARRAY(17) OF VARCHAR(255);
TABLENAME TABLE_NAME;
TOTAL INTEGER;
cnt INTEGER;
BEGIN
  TABLENAME := TABLE_NAME ('FA_AS_ASSIGNMENTS','FA_PE_PHONES' );
  TOTAL     := TABLENAME.COUNT;
  FOR i IN 1 .. TOTAL
  LOOP
     EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || TABLENAME(i) INTO cnt;

    INSERT INTO CUSTOM_ODILOAD_TABLE_COUNT (TABLE_NAME, ROW_COUNT)
      VALUES ( TABLENAME(i), cnt);
  END LOOP;
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2016-10-23
    • 2015-03-31
    • 1970-01-01
    • 2021-05-06
    • 2018-03-27
    相关资源
    最近更新 更多