как поймать все значения записи в строку? - PullRequest
0 голосов
/ 21 января 2020

Для утилиты, которую я пишу, я хотел бы собрать все значения результата выбора (получая только одну строку!) В строку. Т.е. для такого утверждения, как

select * from some_table where some_column = 'somevalue'; 

(где some_column является первичным ключом этой таблицы, т. Е. Он гарантированно содержит только уникальные значения)

Я хотел бы собрать все значения в один строка типа 'value1, value2, ... , valueN', то есть, по сути, как часть "values ​​(...)" оператора вставки SQL.

edit: я добавил раздел, пытаясь лучше объяснить, к чему я стремлюсь:

Ниже приведен фрагмент кода, который я придумал. В реальной жизни переменные p_table_name, p_row_name и p_row_value являются аргументами, передаваемыми в мою утилиту. ИМХО, этот код кажется слишком сложным для того, чего он достигает. Я не могу не поверить, что должен быть более простой способ сделать это.

DECLARE
    p_table_name     VARCHAR2(30) := 'TICKET';
    p_row_name       VARCHAR2(30) := 'TICKET_ID';
    p_row_value      VARCHAR(100) := '72';
    query_statement  VARCHAR2(1000);
    column_value     VARCHAR2(1000); 
    p_all_row_values VARCHAR2(1000) := '';
BEGIN
    for curr_col in (
            select cols.column_name
            from user_tab_columns cols
            where cols.table_name = p_table_name
            order by cols.column_id
        )
    loop
        query_statement := 'select coalesce(to_char(' || curr_col.column_name || '), ''null'') from ' || p_table_name || ' where ' || p_row_name || ' = ' || p_row_value;
        execute immediate query_statement into column_value;
        p_all_row_values := p_all_row_values || ', ' || curr_col.column_name || '=' || column_value;
    end loop;
    p_all_row_values := SUBSTR(p_all_row_values,3);
    dbms_output.put_line('values are: "' || p_all_row_values || '"');
END;

Это создает выходные данные, которые для таблицы "TICKET" и ее строк читаются, например:

values are: "TICKET_ID=72, TICKET_ID_VALUE=c32c717b33e543bbae4955e803624ffa, ERSTELLT_AM=15.01.20 16:51:04.817000, TICKET_VORGAENGER_ID=null, OPERATION_ID=1, QUELLSYSTEM_ID=2"

Примечание. В приведенном выше примере я также добавил имена столбцов плюс '=' к строке, но в реальной жизни я на самом деле просто хочу, чтобы значения, разделенные запятыми, как в моем первоначальном вопросе.

Надеюсь, я смогу прояснить ...

1 Ответ

0 голосов
/ 21 января 2020

Я могу вспомнить два близко, но недостаточно близко варианта.

Первый - использовать SQL* Plus и установить разделитель столбцов в запятую:

SQL> set colsep ','
SQL>
SQL> select * from dept where deptno = 10;

    DEPTNO,DNAME         ,LOC
----------,--------------,-------------
        10,ACCOUNTING    ,NEW YORK

Получившаяся строка выглядит как , что вы хотите.

Другой вариант - объединить столбцы с разделителями:

SQL> select deptno ||','|| dname ||','|| loc from dept where deptno = 10;

DEPTNO||','||DNAME||','||LOC
---------------------------------------------------------------------
10,ACCOUNTING,NEW YORK

SQL>

Это выглядит даже лучше.

Тем не менее, основным недостатком является то, что вы не можете использовать его в VALUES (если это то, что вы хотели), потому что - до тех пор, пока это нормально для чисел, оно не будет работать для строк, которые должны быть заключены в одинарные кавычки. Не говоря уже о датах - какой формат вы будете использовать? Что если они содержат компонент времени (часы, минуты, ...)?

Может быть, только я не могу сделать это должным образом, но - я не уверен, что вы можете сделать это легко, но правильный способ для всех типов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...