我想得到一个结果:表名,AS_TABLE_LIST中每个表的计数数量。
create procedure AtRowCount
as
declare
TableCount NUMBER(1);
TableName VARCHAR2(100);
BEGIN
SelectQuery1:= 'SELECT count(*) FROM ' || TableName || ' INTO ' || TableCount;
FOR TableName IN (select table_name from AS_TABLE_LIST)
LOOP
EXECUTE IMMEDIATE SelectQuery1;
END LOOP;
select TableName, TableCount into AT_ROW_COUNT from dual;
END AtRowCount;
我遇到两个错误:
[错误] PLS-00306(7:19):PLS-00306:错误的编号或类型 调用“ ||”的参数
[错误] ORA-00904(9:8):PL / SQL:ORA-00904:“ TABLENAME”:无效 标识符
我已经尝试了很多次以解决此问题,但仍然遇到相同的错误。 有什么建议吗?
答案 0 :(得分:1)
我不确定您要做什么,但这可能是以下情况:
CREATE PROCEDURE AtRowCount AS
DECLARE
l_count NUMBER;
BEGIN
FOR c IN (SELECT table_name from AS_TABLE_LIST) LOOP
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||c.table_name INTO l_count;
INSERT INTO AT_ROW_COUNT(TableName, TableCount )
VALUES (c.table_name, l_count);
END LOOP;
END AtRowCount;
如果要使程序返回列表而不是将结果插入到新表中,则必须使用管道函数(有关如何使用它的示例,请参见https://oracle-base.com/articles/misc/pipelined-table-functions)。
答案 1 :(得分:0)
您可以通过以下方式在oracle中获取对表名的所有行计数:
select owner, table_name, nvl(num_rows,-1)
from all_tables
order by nvl(num_rows,-1) desc
https://livesql.oracle.com/apex/livesql/file/content_EPJLBHYMPOPAGL9PQAV7XH14Q.html
答案 2 :(得分:-1)
希望这对您有用
CREATE PROCEDURE atrowcount
IS
selectquery1 VARCHAR2(2000);
tablecount NUMBER;
BEGIN
selectquery1:= 'SELECT count(1) FROM :TableName';
FOR i IN (select table_name from AS_TABLE_LIST)
LOOP
EXECUTE IMMEDIATE selectquery1 INTO tablecount USING i.table_name;
INSERT INTO table_list VALUES(i.table_name,TableCount);
END LOOP;
COMMIT;
END AtRowCount;