2

selectステートメントを介して取得された単一の行を、結果の個々の列の連結値を持つ単一の列に変換する必要があります。問題は、列が不明であり、数が異なる可能性があることです。

テーブルが次のようになっているとします。

Table USER
Name  Surname  Age  Logindate  City

Max   Smith    25   20.05.20   NY

結果を、後で他のテーブルの列に挿入できる列名SELECT * FROM USERのような単一の文字列に変換する必要があります。選択しているテーブルの名前は既知であり、ストアド プロシージャ内で実行される SELECT ステートメントにハードコードされています。Max, Smith, 25, 20.05.20, NYName: Max, Surname: Smith, Age: 25, Logindate: 20.05.20, City: NY

列数も列名も不明なのでCONCAT関数が使えません。の出力形式にも満足するつもりでしSELECT JSON_OBJECT(*) FROM USERたが、このようにスター演算子を使用した関数は Oracle18c ではサポートされていません (Oracle19c ではサポートされています)。

単一の行の列の値を単一の文字列に変換するのは基本的な操作のように思えますが、簡単な解決策を見つけることができませんでした。

4

1 に答える 1

0

データ ディクショナリを使用して適切な SQL ステートメントを生成し、動的 ​​SQL を使用してそれを実行します。

--Sample tables for input and output:
create table user_table as
select 'Max' Name, 'Smith' Surname, 25 Age, date '2020-05-20' LoginDate, 'NY' City
from dual;

create table concatenated_values(value varchar2(4000));


--Procedure to read all columns from USER_TABLE and write them to CONCATENATED_VALUES.
create or replace procedure concatenate_values(p_table_name varchar2) is
    v_sql varchar2(4000);
begin
    --Generate a SQL statement to concatenate all the values.
    select
        'select ' ||
        listagg(column_name, '||'',''||') within group (order by column_id) ||
        ' from ' || owner || '.' || table_name
    into v_sql
    from all_tab_columns
    where owner = user
        and table_name = p_table_name
    group by owner, table_name;

    --Run the SQL statement and insert the value.
    execute immediate 'insert into concatenated_values ' || v_sql;
end;
/


--Call the procedure.
begin
    concatenate_values('USER_TABLE');
end;
/


--Results:
select * from concatenated_values;

VALUE
-------------------------
Max,Smith,25,20-MAY-20,NY
于 2020-05-21T05:53:21.603 に答える