【问题标题】:Stored procedure for counting the row count of all the tables in database of a specific owner [duplicate]用于计算特定所有者数据库中所有表的行数的存储过程[重复]
【发布时间】:2014-08-14 07:12:17
【问题描述】:

我正在 oracle 中创建一个存储过程来查找所有表的行数。我必须每天运行这些程序才能找到在 ETL 之后加载的每日数据。我已经创建了以下过程。

create or replace Procedure Proc_RSE_TABLE_ROW_Count AS

TYPE c_table_list IS REF CURSOR ;
C_table_name c_table_list;

RSE_ROW_COUNT NUMBER;
SQL_11g  VARCHAR2(500);
SQL_CURSOR VARCHAR2(500);
V_TABLE_NAME VARCHAR2(30);

BEGIN
SQL_CURSOR := 'SELECT 
TRIM(table_name) table_name
FROM RSE_TABLE_COUNT ';

OPEN C_table_name FOR SQL_CURSOR;
LOOP
FETCH C_table_name INTO V_TABLE_NAME;
EXIT WHEN C_table_name%NOTFOUND;

SQL_11g := 'SELECT COUNT(1) FROM '||V_TABLE_NAME;
EXECUTE IMMEDIATE SQL_11g INTO RSE_ROW_COUNT;

INSERT into RSE_TABLE_COUNT (TABLE_NAME, ROW_COUNT, DATE_LAST_UPDATED)
values ('vtable_name', rse_row_count, sysdate)


/*UPDATE RSE_TABLE_COUNT SET ROW_COUNT=RSE_ROW_COUNT,DATE_LAST_UPDATED=sysdate
WHERE table_name=V_TABLE_NAME;
commit; */

END LOOP;
CLOSE C_table_name;

END;

但我想插入每日数据,而不是我目前使用的。随着更新,历史正在被超越。并且插入我得到错误。我想在运行过程时在表中插入 table_name、row_count 和 sysdate,而不影响以前的数据。我是 oracle 语法的新手,所以请帮忙..

【问题讨论】:

  • 您能否更具体地说明您的要求以及您的错误是什么?
  • 错误如下:/*错误(25,1):PL/SQL:SQL语句被忽略/*错误(26,28):PL/SQL:ORA-01756:引用的字符串不正确终止/ *错误(37):PLS-00103:在预期以下之一时遇到符号“文件结尾”:;通过更新,我得到了我想要的,但前几天的计数被删除了。
  • 啊,你的意思是说,当你更新时,上一行正在更新为当前行?
  • 是的。我得到今天的计数,但我希望昨天的计数与昨天的日期保持一致。
  • 那么您不应该更新该记录,而是应该通过插入记录来添加新行。

标签: oracle oracle11g


【解决方案1】:

看下面的sn-p代码,和你的很相似,它可以正确插入行。

CREATE TABLE RSE_TABLE_COUNT
(
  TABLE_NAME         VARCHAR2(500 BYTE),
  ROW_COUNT          NUMBER,
  DATE_LAST_UPDATED  DATE
);

CREATE OR REPLACE PROCEDURE Proc_RSE_TABLE_ROW_Count
AS
   TYPE c_table_list IS REF CURSOR;

   C_table_name    c_table_list;

   RSE_ROW_COUNT   NUMBER;
   SQL_11g         VARCHAR2 (500);
   SQL_CURSOR      VARCHAR2 (500);
   V_TABLE_NAME    VARCHAR2 (30);
BEGIN
   SQL_CURSOR := 'SELECT 
object_name
FROM user_objects
WHERE object_type=''TABLE''';

   OPEN C_table_name FOR SQL_CURSOR;

   LOOP
      FETCH C_table_name INTO V_TABLE_NAME;

      EXIT WHEN C_table_name%NOTFOUND;

      SQL_11g := 'SELECT COUNT(1) FROM ' || V_TABLE_NAME;

      EXECUTE IMMEDIATE SQL_11g INTO RSE_ROW_COUNT;

      INSERT INTO RSE_TABLE_COUNT (TABLE_NAME, ROW_COUNT, DATE_LAST_UPDATED)
           VALUES (V_TABLE_NAME, rse_row_count, SYSDATE);         

   END LOOP;

   CLOSE C_table_name;
END;

【讨论】:

  • 是的,这是编译没有任何错误。感谢帮助。我现在将测试我的代码
【解决方案2】:

为什么不分析架构(estimate_percent=100)并从 user_tables 中选择 num_rows?您的 ETL 中可能已经有一个 gather_schema_stats。之后:

insert into rse_table_count
select table_name,num_rows,sysdate
from user_tables;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多