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
我必须获取存储在所有数据库 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