将每个记录的所有列连接成一个条目

3

我将尝试将一张表的记录提取到CSV文件中。 SQL查询语句非常简单:

SELECT * FROM MY_TABLE_NAME

给出一个假设的记录集。
A B C D
E F G H
I J K L

我想要的是一个记录集,其中所有列都连接在一起,例如:
A, B, C, D
E, F, G, H
I, J, K, L

我曾接触过LISTAGG,但我不想聚合记录。我想保留每个单独行条目的结构,只需用分隔符分隔即可。你有什么想法吗?
编辑:
我需要将查询应用于多个表格,其中我不知道列数。此外,表格结构会定期更改,我需要它足够灵活以适应这种变化。
2个回答

4

只需使用连接运算符:

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

这种情况下这是行不通的,因为我不知道有多少列存在。我需要将查询应用于多个表,其结构可能会定期更改。 - SandPiper
在列的数量和名称事先未知的情况下,是否没有动态执行此操作的方法? - SandPiper
@SandPiper . . . 您需要使用动态SQL。 - Gordon Linoff
@GordonLinoff 如果该字符串超过4000个字符怎么办?我收到了拼接字符串太长的错误。 - EXODIA

1

经过更多的工作,我得出了一个答案。非常感谢在这个不同但相关的主题中提供的帮助:如何通过ID或索引号引用列

最终方案:我创建了一个具有动态SQL的查询,然后使用EXECUTE IMMEDIATE运行它。结果被循环输出。这是一个更加优雅的解决方案。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接