Arrays 如何在oracle中追加数组并插入到单个字段中
我不确定标题是否正确 我已经创建了一个下表Arrays 如何在oracle中追加数组并插入到单个字段中,arrays,oracle,plsql,Arrays,Oracle,Plsql,我不确定标题是否正确 我已经创建了一个下表 create table healthcheck ( fordate date default sysdate, tablespace_status varchar2(100), comments varchar2(200) ); 现在,在PL/SQL代码中,我使用以下语句 select tablespace_name, used_percent from dba_tablespace_usage_metrics where used_perce
create table healthcheck
(
fordate date default sysdate,
tablespace_status varchar2(100),
comments varchar2(200)
);
现在,在PL/SQL代码中,我使用以下语句
select tablespace_name, used_percent
from dba_tablespace_usage_metrics
where used_percent > 70;
对于ex,上述查询的输出为:
USERS 75
TEMP 80
现在,我希望将此输出存储在列tablespace\u status
中,作为“USERS:75%,TEMP:80%”存储在单个字段中
我怎样才能做到这一点 希望下面的snipet会有所帮助。
注意:WMSYS.WM_CONCAT是未记录的函数,所以如果数据库中存在对象,它肯定会工作。另一种选择是LISTAGG
Approach 1 :LISTAGG
CREATE TABLE healthcheck
(
fordate DATE DEFAULT sysdate,
tablespace_status VARCHAR2(100),
COMMENTS VARCHAR2(200)
);
INSERT INTO HEALTHCHECK
SELECT sysdate,
LISTAGG(tablespace_name
||':'
||ROUND(USED_PERCENT)
||':'
||Dbname, ', ') within GROUP (
ORDER BY tablespace_name DESC) status,
NULL
FROM
(SELECT tablespace_name,
USED_PERCENT ,
(SELECT global_name FROM global_name@dblink1
) Dbname
FROM DBA_TABLESPACE_USAGE_METRICS@dblink1
WHERE USED_PERCENT > 70
UNION ALL
SELECT tablespace_name ,
USED_PERCENT ,
(SELECT global_name FROM global_name@dblink2
) Dbname
FROM DBA_TABLESPACE_USAGE_METRICS@dblink2
WHERE USED_PERCENT > 70
--union all for all 5 dblinks
)a ;
插入1行
Approach 2 : WMSYS.WM_CONCAT
INSERT INTO HEALTHCHECK
SELECT sysdate,
WMSYS.WM_CONCAT(a.fld),
NULL
FROM
(SELECT tablespace_name
||':'
||round(used_percent)||':'||ORA_DATABASE_NAME fld
FROM DBA_TABLESPACE_USAGE_METRICS
WHERE used_percent > 70
)A;
插入1行。此解决方案对您有帮助吗?如果是,你能接受答案吗?对于方法1,错误是因为值太多,对于方法2,错误是因为缺少右括号。您能帮忙吗?另外,如果您能建议哪种方法最适合进行性能调优,那就太好了。方法1适合进行调优。此外,查询工作正常。请您检查一下您是如何运行查询的。另外,您是否可以检查您正在运行的oracle版本?方法1正在运行,但要求从5个不同的数据库获取表空间,如果表空间>70%,我需要将其插入一个字段,即表空间\ U状态列。另外,如果您能帮助我像“tablespacename:tablespacepercent:dbname”那样插入它,那将非常棒!!
Approach 2 : WMSYS.WM_CONCAT
INSERT INTO HEALTHCHECK
SELECT sysdate,
WMSYS.WM_CONCAT(a.fld),
NULL
FROM
(SELECT tablespace_name
||':'
||round(used_percent)||':'||ORA_DATABASE_NAME fld
FROM DBA_TABLESPACE_USAGE_METRICS
WHERE used_percent > 70
)A;