ORA-00903,ORA-06512,同时计算所有用户表的行数(动态 sql)
Posted
技术标签:
【中文标题】ORA-00903,ORA-06512,同时计算所有用户表的行数(动态 sql)【英文标题】:ORA-00903, ORA-06512, while counting count of rows of all user tables(dynamic sql) 【发布时间】:2014-04-03 11:26:36 【问题描述】:我想统计每个用户表的行数,但是通过动态sql,出现这样的错误。 ORA-00903: 无效的表名 ORA-06512: 在第 19 行 SQL2.sql 20 2
DECLARE
TYPE cursor_type IS REF CURSOR;
curs1 cursor_type;
ammount NUMBER;
stmnt1 VARCHAR2(200);
stmnt2 VARCHAR2(200);
T_NAME VARCHAR2(100);
BEGIN
stmnt1 := 'SELECT TABLE_NAME FROM USER_TABLES';
stmnt2 := 'SELECT COUNT(*) FROM :1';
IF curs1%ISOPEN THEN
CLOSE curs1;
END IF;
OPEN curs1 FOR stmnt1;
LOOP
FETCH curs1 INTO T_NAME;
EXIT WHEN curs1%NOTFOUND;
EXECUTE IMMEDIATE stmnt2 INTO ammount USING T_NAME;
DBMS_OUTPUT.PUT_LINE('Table ' || T_NAME || ' - ' || ammount || ' rows');
END LOOP;
CLOSE curs1;
END;
【问题讨论】:
【参考方案1】:您不能提供表名作为绑定变量。您必须将其连接到您的语句中:
DECLARE
TYPE cursor_type IS REF CURSOR;
curs1 cursor_type;
amount NUMBER;
stmnt1 VARCHAR2(200);
stmnt2 VARCHAR2(200);
T_NAME VARCHAR2(100);
BEGIN
stmnt1 := 'SELECT TABLE_NAME FROM USER_TABLES';
stmnt2 := 'SELECT COUNT(*) FROM ';
IF curs1%ISOPEN THEN
CLOSE curs1;
END IF;
OPEN curs1 FOR stmnt1;
LOOP
FETCH curs1
INTO T_NAME;
EXIT WHEN curs1%NOTFOUND;
EXECUTE IMMEDIATE stmnt2 || t_name
INTO amount;
DBMS_OUTPUT.PUT_LINE('Table ' || T_NAME || ' - ' || amount || ' rows');
END LOOP;
CLOSE curs1;
END;
更新 一个更简单(恕我直言,更具可读性)的版本,使用循环游标:
declare
amount number;
begin
for cur in (select table_name from user_tables)
loop
execute immediate 'SELECT COUNT(*) FROM ' || cur.table_name
into amount;
DBMS_OUTPUT.PUT_LINE('Table ' || cur.table_name || ' - ' || amount ||
' rows');
end loop;
end;
【讨论】:
谢谢。但有趣的是,为什么我不能使用表名作为绑定变量?在哪种情况下我可以使用名称作为绑定变量,在哪种情况下不可以? @user3474380:你永远不能使用标识符作为绑定变量。以上是关于ORA-00903,ORA-06512,同时计算所有用户表的行数(动态 sql)的主要内容,如果未能解决你的问题,请参考以下文章
pyspark 读取格式 jdbc 生成 ORA-00903: invalid table name 错误
PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效
链接服务器“FDMEE_SIMPHONY”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“ORA-00903:无效表名”
ORA-01722:无效号码 ORA-06512:在“BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:在第 2 行