2017-10-09 10 views
1

(オラクル)Iクエリを持っ

SELECT originating_timestamp 
FROM sys.x$dbgalertext 
WHERE message_text LIKE '%Starting up%' 
    and to_char(ORIGINATING_TIMESTAMP,'DD-MON-YY') = to_char(systimestamp,'DD-MON-YY'); 

Linuxのスクリプトの出力は以下の通りである:

09-OCT-17 04.59.33.758 AM -05:00 09-OCT-17 05.03.22.645 AM -05:00 

は、各出発上記二列あります日付によって。すべての行を区切り文字により分離さように、私はこれがわずか2行で、より多くの存在することができ

09-OCT-17 04.59.33.758 AM -05:00;09-OCT-17 05.03.22.645 AM -05:00 

のような出力を持っていると思い

、私はそれをしたいと思います。

私はLISTAGGを使用して)

1のようないくつかのオプションを試してみました:

select listagg(originating_timestamp,', ') within group(order by originating_timestamp) csv 
from sys.x$dbgalertext 
WHERE message_text LIKE '%Starting up%' 
    and to_char(ORIGINATING_TIMESTAMP,'DD-MON-YY') = to_char(systimestamp,'DD-MON-YY'); 

しかし、これはエラーを与える:行1で ERROR:

ORA-01489: result of string concatenation is too long 

2)XMLAGGを使用して

SELECT RTRIM(XMLAGG(XMLELEMENT(E,originating_timestamp,';').EXTRACT('//text()') ORDER BY originating_timestamp).GetClobVal(),',') AS LIST 
FROM sys.x$dbgalertext 
WHERE message_text LIKE '%Starting up%' 
    and to_char(ORIGINATING_TIMESTAMP,'DD-MON-YY')= to_char(systimestamp,'DD-MON-YY'); 

しかし、出力は次のようになります。

2017-10-09T04:59:33.758-05:00;2017-10-09T05:03:22.645-05:00; 

これも正しくありません。

Select username from dba_users。 10人のユーザーがいるとします。10人のユーザー名を区切り記号で区切ります。あなたの問題を解決するために有用であることができる2つの無名ブロックの例以下は

+0

必要がありますか? – Frank

+0

yesカンマ、セミコロン... 2つの出力間の区切り文字。 –

答えて

0

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
res VARCHAR2(100); 
tmp VARCHAR2(100); 
BEGIN 
    FOR i IN 1..10 LOOP 
     IF i != 10 THEN  
     select 'a' ||',' into tmp from dual; 
     ELSE 
      select 'a' into tmp from dual; 
     END IF; 

     res := concat(res,tmp); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(res); 
END; 
/

第二:

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
res VARCHAR2(1000); 
tmp VARCHAR2(1000); 
BEGIN 
    FOR i IN 1..10 LOOP 
     IF i != 10 THEN  
     select TO_CHAR(sysdate,'DD-MON-YYYYHH24:MI') || ',' into tmp from dual; 
     ELSE 
      select TO_CHAR(sysdate,'DD-MON-YYYYHH24:MI') into tmp from dual; 
     END IF; 
     res := concat(res,tmp); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(res); 
END; 
/

あなたをあなたを選択して、もちろん、日付の形式私のクエリを置き換える必要がありますコンマを取得してあなたの欲望のキャラクターに置き換えたいそれは私がしたい適切に操作できるようにするに

はあなたがカーソルを作成することをお勧め:あなたはコンマは、文字列を分離

SET SERVEROUTPUT ON SIZE 1000000 
      DECLARE 
      res VARCHAR2(100); 
      tmp VARCHAR2(100); 
      cont NUMBER; 
      CURSOR C_1 IS 
       SELECT to_char(originating_timestamp,'your date format') 
      originating_timestamp 
      FROM sys.x$dbgalertext 
      WHERE message_text LIKE '%Starting up%' 
      and to_char(ORIGINATING_TIMESTAMP,'DD-MON-YY') = to_char(systimestamp,'DD-MON-YY'); 
      BEGIN 
       cont := 0; 
       FOR C_row IN C_1 LOOP 
        IF cont != C_1%rowcount THEN  
        tmp := C_row.originating_timestamp ||','; 
        res := concat(res,tmp); 
        ELSE 
         tmp := C_row.originating_timestamp; 
         res := concat(res,tmp); 
        END IF; 
        cont := cont +1; 
       END LOOP; 
       DBMS_OUTPUT.PUT_LINE(res); 
      END; 
      /
+0

こんにちはフランク、ありがとう、しかし、単一のクエリがあり、それは一度に複数の行を与えている、私は区切り文字を介してこれらの行を区切りたい。例: ユーザー名をdba_usersから選択します。 10人のユーザーがいるとします。10人のユーザー名を区切り記号で区切りたいと思います。 お願いします。 –

+0

私は答えを編集し、あなたはカーソルを使って問題を解決し、それを反復します – Frank

+0

多くのありがとうフランク、期待どおりに働いた。 –

関連する問題