Выберите записи столбцов определенного формата в SQL - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу выбрать / отобразить столбцы таблицы определенного формата. Я написал следующий запрос:

 SELECT 
   (SELECT 
      COLUMN_NAME 
    FROM SYS.ALL_TAB_COLS 
    WHERE TABLE_NAME='SOME_TABLE' AND DATA_TYPE IN ('DATE')) 
 FROM SOME_TABLE;

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

ORA-01427: single-row subquery returns more than one row

Я бы хотел получить результат, похожий на:

      DATE1       DATE2
 2017-01-01  2017-01-01
 2017-01-01  2018-01-02
        ...         ...

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Используйте этот запрос для возврата строк в столбцах, а затем вы можете использовать и форматировать столбцы, которые динамически возвращаются с помощью команды EXECUTE IMMEDIATE

SELECT LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(ORDER BY COLUMN_NAME) AS COLUMNA FROM (
        SELECT COLUMN_NAME 
        FROM SYS.ALL_TAB_COLS 
        WHERE TABLE_NAME = 'SOME_TABLE' AND DATA_TYPE IN ('DATE')
    ) SOME_TABLE

RESULT:
DATE1, DATE2
0 голосов
/ 24 апреля 2018

Вы можете использовать переменную привязки refcursor и использовать команду PRINT для отображения результатов динамического запроса.Это работает в SQL * Plus и в Toad и SQL Developer при запуске в виде скрипта.

VARIABLE x refcursor; 
DECLARE 
    v_query CLOB; 
BEGIN 
    SELECT 'SELECT ' 
           || LISTAGG(column_name, ',') 
                within GROUP ( ORDER BY column_name ) 
           || ' FROM ' 
           || table_name 
    INTO   v_query 
    FROM   sys.all_tab_cols 
    WHERE  table_name = 'EMPLOYEES' 
           AND data_type IN ( 'DATE' ) 
    GROUP  BY table_name; 

    OPEN :x FOR v_query; 
END; 

/ 
PRINT x; 

для 12c и выше, вы можете использовать DBMS_SQL.RETURN_RESULT для курсора PL / SQL в том же запросе.

DECLARE 
    v_query CLOB; 
    x SYS_REFCURSOR; 
BEGIN 
    SELECT..
          ..
    OPEN x FOR v_query; 
    DBMS_SQL.RETURN_RESULT(x);
END; 
/ 

Примечание. Если в разных схемах имеется несколько таблиц с одинаковым именем, вам также необходимо добавить owner = <schema>.

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