2017-02-07 35 views
0

我不知道标题是否正确与否如何追加数组,并插入到单个字段在Oracle

我已经在PL/SQL代码,我创建了一个如下表

create table healthcheck 
(
fordate date default sysdate, 
tablespace_status varchar2(100), 
comments varchar2(200) 
); 

现在使用下面的语句

select tablespace_name, used_percent 
from dba_tablespace_usage_metrics 
where used_percent > 70; 

对于离,上述查询的输出是:

USERS 75 
TEMP 80 

现在我希望这个输出在单个字段中作为'用户:75%,TEMP:80%'存储在列tablespace_status

我该如何做到这一点?

回答

0

希望低于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 [email protected] 
    ) Dbname 
    FROM [email protected] 
    WHERE USED_PERCENT > 70 
    UNION ALL 
    SELECT tablespace_name , 
    USED_PERCENT , 
    (SELECT global_name FROM [email protected] 
    ) Dbname 
    FROM [email protected] 
    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行。

+0

该解决方案对您有帮助吗?如果可以,请接受答案? –

+0

对于方法1,错误是由于太多的数值而引起的,对于方法2,错误即将作为右括号丢失。能否请你帮忙? – Nik

+0

另外,如果您可以建议哪种方法最适合性能调优,那就太好了。 – Nik

相关问题