Sql Pls-00364:循环索引变量';j';使用无效

Sql Pls-00364:循环索引变量';j';使用无效,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试获取模式中每个表的计数 SET serveroutput ON; BEGIN FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP FOR J IN (SELECT COUNT(1) CNT FROM I.TABLE_NAME) LOOP DBMS_OUTPUT.PUT_LINE(I.TABLE_NAME||'>>'||J.CNT); END LOOP; END LOOP; END; / 但是我得到了这样的错误 Error

我正在尝试获取模式中每个表的计数

SET serveroutput ON;
BEGIN
FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
FOR J IN (SELECT COUNT(1) CNT FROM I.TABLE_NAME) LOOP
DBMS_OUTPUT.PUT_LINE(I.TABLE_NAME||'>>'||J.CNT);
END LOOP;
END LOOP;
END;
/
但是我得到了这样的错误

Error report:
ORA-06550: line 3, COLUMN 37:
PL/SQL: ORA-00942: TABLE OR VIEW does NOT exist
ORA-06550: line 3, COLUMN 10:
PL/SQL: SQL Statement ignored
ORA-06550: line 4, COLUMN 42:
PLS-00364: loop INDEX variable 'J' USE IS invalid
ORA-06550: line 4, COLUMN 1:
PL/SQL: Statement ignored
它可以在sql查询本身中实现吗,。?
/

您需要使用动态sql来实现这一点:

DECLARE 
  val NUMBER;
BEGIN
FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
  EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || i.table_name INTO val;
  DBMS_OUTPUT.PUT_LINE(i.table_name || ' ==> ' || val );
END LOOP;
END;
/

您需要使用动态sql来实现这一点:

DECLARE 
  val NUMBER;
BEGIN
FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
  EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || i.table_name INTO val;
  DBMS_OUTPUT.PUT_LINE(i.table_name || ' ==> ' || val );
END LOOP;
END;
/
不能将变量(隐式循环记录是变量)用作表名。您需要动态SQL。可能的重复项不能使用变量(隐式循环记录是变量)作为表名。您需要动态SQL。可能存在的重复项