Oracle 函数或查询获取所有数据库表的数据?

Oracle Function or Query to get data for all DB tables?

我必须获取存储在所有数据库 table 中的数据的最小和最大日期,并将其与 table 名称一起显示。我在下面写了同样的功能

CREATE OR REPLACE FUNCTION data_bound(tbl_name IN VARCHAR2) RETURN VARCHAR2
AS
  reqdates VARCHAR2;
BEGIN
  EXECUTE IMMEDIATE 'SELECT concat(min(rec_date),max(rec_date)) from ' || tbl_name INTO reqdates;
  RETURN reqdates;
END;


我正在尝试使用以下方法获取数据。

SELECT table_name, data_bound(table_name) FROM user_tables;

但是我的 function 似乎工作正常,出现多个错误。请您指出这里出了什么问题,以及是否有其他更好的方法。

错误 1:定义了 data_bound() 函数。 data_retention() 函数被调用

错误2:tbl_name被作为输入,但没有被使用(t_name被使用了一次)

错误 3:'from' 立即执行语句中缺少关键字

错误 4:'into' 关键字应放在 'from tableName'

之前

您可以使用:

CREATE FUNCTION data_bound(
  tbl_name IN VARCHAR2
) RETURN VARCHAR2
AS
  reqdates VARCHAR2(39);
BEGIN
  EXECUTE IMMEDIATE 'SELECT TO_CHAR(min(rec_date), ''YYYY-MM-DD HH24:MI:SS'')
                         || ''-'' || TO_CHAR(max(rec_date), ''YYYY-MM-DD HH24:MI:SS'')
                     FROM   ' || DBMS_ASSERT.SIMPLE_SQL_NAME(tbl_name)
    INTO reqdates;
  RETURN reqdates;
END;
/

其中,如果你有 table:

CREATE TABLE table_name (rec_date) AS
SELECT TRUNC(SYSDATE, 'YYYY') FROM DUAL UNION ALL
SELECT SYSDATE FROM DUAL;

然后:

SELECT data_bound('TABLE_NAME') FROM DUAL;

输出:

DATA_BOUND('TABLE_NAME')
2022-01-01 00:00:00-2022-04-19 18:57:25

db<>fiddle here