2016-08-09 4 views
2

テーブルのレコードをcsvファイルに抽出しようとしています。 SQLクエリは、私が欲しいもの各レコードのすべての列を1つのエントリに連結する

A B C D 
E F G H 
I J K L 

の仮想的なレコードセットを与える

SELECT * FROM MY_TABLE_NAME 

ほど単純である、例えば、すべての列が一緒に連結されているレコードセットです

A, B, C, D 
E, F, G, H 
I, J, K, L 

私はLISTAGGに曝されていますが、私はレコードを集約したくありません。私は、区切り文字で区切られた個々のライン入力の構造を維持したい。何かご意見は?

EDIT:

私は列の数が何であるかを知らない複数のテーブルにクエリを適用する必要があります。さらに、テーブル構造は定期的に変更されるため、それを考慮に入れて柔軟に対応する必要があります。

答えて

0

を、私は答えを思い付きました。 How to Refer to a Column by ID or Index Number

ボトムライン:私は動的SQLを使ってクエリを作成した後、EXECUTE IMMEDIATEで実行しました。結果はループされ、1つずつ出力されました。より洗練されたソリューションでした。

DECLARE 
    j number := 0; 
    sql_query varchar2(32000); 
    l_tableheaders varchar2(32000); 
    TYPE array_type IS TABLE OF varchar2(200) NOT NULL index by binary_integer; 
    Data_Array array_type; 
    MyTableName := 'TableName'; 

BEGIN 
    SELECT LISTAGG(column_name, ' || '','' || ') WITHIN GROUP (ORDER BY column_id) 
     INTO l_tableheaders FROM all_tab_cols WHERE table_name = MyTableName; 

    sql_query := ' SELECT ' || l_tableheaders || ' FROM ' || MyTableName; 

    EXECUTE IMMEDIATE sql_query BULK COLLECT INTO Data_Array; 

    FOR j in 1..Data_Array.Count 
    LOOP 
     DBMS_OUTPUT.PUT (Data_Array(j)); 
     DBMS_OUTPUT.NEW_LINE; 
    END LOOP; 

END; 
5

ただ、連結演算子を使用します。これについて、より多くの仕事の後

select col1 || ', ' || col2 || ', ' || col3 || ', ' || col4 
from t; 
+0

この場合、いくつの列が存在するかわからないため、これは機能しません。構造を定期的に変更できる複数のテーブルにクエリを適用する必要があります。 – SandPiper

+0

列の番号と名前が不明な場合は、これを動的に行う方法はありませんか? – SandPiper

+0

@SandPiper。 。 。動的SQLを使用する必要があります。 –

関連する問題