0
votes

While writing a PL/SQL block I get the error shown below. Kindly let me know the cause of this error?

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;

Error:

ORA-06550: line 19, column 40: PL/SQL: ORA-00907: missing right parenthesis
ORA-06550: line 10, column 5: PL/SQL: SQL Statement ignored 06550. 00000 -
"line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action: anonymous block completed

1
Error cause: dynamic table name is not allowed in SQL. - Lukasz Szozda
Below is the error received: Error report: ORA-06550: line 19, column 40: PL/SQL: ORA-00907: missing right parenthesis ORA-06550: line 10, column 5: PL/SQL: SQL Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action: anonymous block completed - Shanmukha Reddy

1 Answers

2
votes

You cannot have dynamic table name for static query(i.e. table name cannot be parametrized):

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;