如何在oracle中追加数组并插入单个字段

时间:2017-02-07 09:34:31

标签: 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_percent > 70;

例如,上述查询的输出为:

USERS  75
TEMP   80

现在我希望此输出存储在tablespace_status列中,因为'用户:75%,TEMP:80%'在一个单一的领域。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

希望在snipet之下有所帮助。 注意:WMSYS.WM_CONCAT是未记录的函数,因此如果对象存在于您的数据库中,它将定义为worK。替代方案是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行。