Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > получить таблицу с именем и значением поля


Автор: Fyrklod 26.10.2010, 17:29
Доброе время суток.

попытаюсь сразу изложить задачу

есть выборка 
Код

select field1 as f1, field2 as f2, field3, field4
from table
where field1=value1; 


- результат этой выборки - одна строка

есть ли какой-то нормальный способ получения таблицы в виде
----------------
f1 | value1
----------------
f2 | value2
----------------
field3 | value3
----------------
field4 | value4
----------------

Заранее благодарен за помощь!

P.S. использую Oracle 8i поэтому функция UNPIVOT не поможет

Автор: Zloxa 27.10.2010, 08:42
Код

select decode(t_id,1,'field1',2,'field2',3,'field3',4,'field4') field_name
       ,decode(t_id,1,field1,2,field2,3,field3,4,field4) field_val
from table,(select 1 t_id from dual union all select 2 from dual union all select 3 from dual union all select 4 from dual )
where field1=value1;

Автор: Fyrklod 27.10.2010, 11:13
увы такой вариант мимо....
дело в том, что запросы у меня хранятся... и в зависимости от случаев выполняется свой запрос... в одном выдает 10 полей, в другом 15 
имена у этих полей тоже различные.....

мне нужно нечто универсальное.... чтобы не зная количество и имена полей

Автор: Zloxa 27.10.2010, 11:18
Цитата(Fyrklod @  27.10.2010,  11:13 Найти цитируемый пост)
чтобы не зная количество и имена полей 

Тогда Вам и Unpivot бы не помог.
На девятке можно было бы поробовать через dbms_xmlgen... на восьмерке - не знаю был ли он.

Автор: password 28.10.2010, 17:14
А нельзя создать например функцию:
Код

FUNCTION TEST (parr IN Varchar2) RETURN Varchar2
 iS
 TYPE GenericCursor IS REF CURSOR;
 c1 GenericCursor;
 result Varchar2(250);
BEGIN

OPEN c1 FOR parr;
        FETCH c1 INTO result;
    CLOSE c1;

RETURN to_char(result);
END;


А дальше строить sql запросы:
Код

select TABLE_NAME, 
          COLUMN_NAME, 
          test('select to_char('||COLUMN_NAME||') from "Таблица" where field1=value1') as zn  from sys.all_tab_cols
where OWNER='Схема' and TABLE_NAME='Таблица'


Выведет значения в виде:  
  
 Таблица   Столбец  Значение 
  Таблица       Поле1           value1
  Таблица       Поле2           value2
  Таблица       Поле3           value3

а дальше уже строить другие варианты запросов

Автор: Zloxa 28.10.2010, 23:10
password, восхитительно.
Я даже не сразу понял о чем речь, мне это изначально показалось похожим на бред. 
А оно ведь действительно будет работать.
Столь извращенная трактовка сути вопроса - восхищает.

Ну а если по серьезному, то если есть возможность пайплайну использовать, то уж лучше выполнить запрос с помощью dbms_sql и запайпить первую строчку.
Только надо задать вопрос ТС, зачем ему это нужно.
Сдается мне, что тем самым он хочет решить банальный вопрос - как гридину показать в виде проперти палеты.

Автор: Fyrklod 6.7.2011, 14:54
ой.. че-то подзабыл про этот топик...

короче помог  dbms_sql.describe_columns

пример простой работы:
Код

DECLARE
   cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
   cols DBMS_SQL.DESC_T;
   ncols PLS_INTEGER;
BEGIN
   DBMS_SQL.PARSE(cur, 'SELECT hiredate, sal FROM emp', DBMS_SQL.NATIVE);
   DBMS_SQL.DEFINE_COLUMN (cur, 1, SYSDATE);
   DBMS_SQL.DEFINE_COLUMN (cur, 2, 1);
   DBMS_SQL.DESCRIBE_COLUMNS (cur, ncols, cols);
   FOR colind IN 1 .. ncols
   LOOP
      DBMS_OUTPUT.PUT_LINE (cols.col_name);
   END LOOP;
   DBMS_SQL.CLOSE_CURSOR (cur);
END;
 

при его помощи я получил всю информацию о своем запросе: количество и имена-типы-длины-.. полей запроса (не выполненного, а любого,лишь бы синтаксически корректного) 
а дальше - ручками (или сценарием) сформировал запрос для_разворота


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)