Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Получение данных по индексу колонки  [new]
Mordozz
Member

Откуда:
Сообщений: 4
Приветствую застрял с написанием запроса.
Есть таблица следующей структуры

name|one|two|three

необходимо выцеплять данные по запросу номера индекса колонки из таблицы USER_TAB_COLS, чтобы структура выглядела так

column_name|column_id|name|[наименование колонки из первой таблицы, например one, т.е. column_id = 2]

Сразу оговорюсь что делается это для внедрение Dynamic SQL
9 сен 16, 15:50    [19647845]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
-2-
Member

Откуда:
Сообщений: 15330
Люди делятся на тех, кто умеет читать документацию,
Кто умеет задавать вопросы,
И тех, кому нужен динамический sql.
9 сен 16, 16:32    [19648113]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9242
-2-
...И тех, кому нужен динамический sql.

Я сначала обиделся, потом подумал, что Вы наверное не про меня говорите )))
9 сен 16, 16:40    [19648157]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
stax..
Guest
Mordozz
Приветствую застрял с написанием запроса.
Есть таблица следующей структуры

name|one|two|three

необходимо выцеплять данные по запросу номера индекса колонки из таблицы USER_TAB_COLS, чтобы структура выглядела так

column_name|column_id|name|[наименование колонки из первой таблицы, например one, т.е. column_id = 2]

Сразу оговорюсь что делается это для внедрение Dynamic SQL

в чем различия column_name и наименование колонки ?

пример что надо получить?

.....
stax
9 сен 16, 18:55    [19648691]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
Mordozz
Member

Откуда:
Сообщений: 4
Перейду от общего к частному
Есть одна пользовательская таблица со следующей структурой
CREATE TABLE table1
       (o_name varchar2,
        one number(10),
        two number(10),
        three number(10)
        );

И есть оракловая таблица USER_TAB_COLUMNS, где хранятся описания всех созданных таблиц. В том числе и все COLUMN_ID требуемой таблицы. Задача состоит в том , чтобы написать функцию, при которой каждый раз когда обращаешься к ней данные из колонок перезаписывались в последующие . Например
|o_name|one|two|three|
|belka |23 |0 |12 |
|strelka |12 |54 |41 |
При вызове этой функции получилось бы

|o_name|one|two|three|
|belka |23 |23 |0 |
|strelka |12 |12 |54 |

Число колоннок имеет n-oe количество. Поэтому я пришёл к выводу ,что разумнее запускать цикл по COLUMN_ID в данном примере смещение происходило бы с CULUMN_ID := 2 (one); и дальше бы происходила инкрементация. Загвоздка для меня в том , чтобы осуществить это необходимо как-то связать пользовательскую таблицу и оракловскую, но по структуре они абсолютно разные . А так как к СУБД я пока что на ВЫ, решил попытать счастья на этом форуме.
9 сен 16, 20:44    [19649048]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
NунпивотколлектNпивот/хмл
Guest
Mordozz,

разложи в ряд и соедини обратно. но вот беда, получить поля динамически не проблема, да в общем-то и статически звездочку в метаструктурирлванный набор не приблема. но вот получить обратно динамическое поколонство можно только через одцитаблядство. оно действительно нужно? задача-то адекватно решаема только для однотипа.
ну и для студентов, не желающих учиться, есть форум работа.
10 сен 16, 00:25    [19649791]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
Mordozz
Member

Откуда:
Сообщений: 4
stax.., Хотелось бы получить следующее
column_name|Column_id|name |value
one | 2 |belka | 23
one | 2 |strelka | 12
10 сен 16, 09:52    [19650042]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Mordozz
Задача состоит в том , чтобы написать функцию, при которой каждый раз когда обращаешься к ней данные из колонок перезаписывались в последующие


SQL> CREATE OR REPLACE
  2    PROCEDURE P1
  3      IS
  4          CURSOR V_CUR
  5            IS
  6              WITH T AS (
  7                         SELECT  COLUMN_NAME,
  8                                 LAG(COLUMN_NAME) OVER(ORDER BY COLUMN_ID) PREV_COLUMN_NAME
  9                           FROM  USER_TAB_COLUMNS
 10                           WHERE TABLE_NAME = 'TABLE1'
 11                           AND COLUMN_ID > 1
 12                        )
 13              SELECT  '"' || COLUMN_NAME || '" ="' || PREV_COLUMN_NAME || '"' EXPR
 14                FROM  T
 15                WHERE PREV_COLUMN_NAME IS NOT NULL;
 16          V_SQL CLOB;
 17      BEGIN
 18          V_SQL := 'UPDATE table1 SET ';
 19          FOR V_REC IN V_CUR LOOP
 20            V_SQL := V_SQL || V_REC.EXPR || ',';
 21          END LOOP;
 22          V_SQL :=  RTRIM(V_SQL,',');
 23          EXECUTE IMMEDIATE V_SQL;
 24      END;
 25      /

Procedure created.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23          0         12
strelka            12         54         41

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23         23          0
strelka            12         12         54

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23         23         23
strelka            12         12         12

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23         23         23
strelka            12         12         12

SQL>


A если по-кругу:

SQL> CREATE OR REPLACE
  2    PROCEDURE P1
  3      IS
  4          CURSOR V_CUR
  5            IS
  6              SELECT  '"' || COLUMN_NAME || '" ="' ||
  7                        CASE COLUMN_ID
  8                          WHEN 2
  9                            THEN FIRST_VALUE(COLUMN_NAME) OVER(ORDER BY COLUMN_ID DESC)
 10                          ELSE LAG(COLUMN_NAME) OVER(ORDER BY COLUMN_ID)
 11                        END || '"' EXPR
 12                FROM  USER_TAB_COLUMNS
 13                WHERE TABLE_NAME = 'TABLE1'
 14                  AND COLUMN_ID > 1;
 15          V_SQL CLOB;
 16      BEGIN
 17          V_SQL := 'UPDATE table1 SET ';
 18          FOR V_REC IN V_CUR LOOP
 19            V_SQL := V_SQL || V_REC.EXPR || ',';
 20          END LOOP;
 21          V_SQL :=  RTRIM(V_SQL,',');
 22          EXECUTE IMMEDIATE V_SQL;
 23      END;
 24      /

Procedure created.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23          0         12
strelka            12         54         41

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              12         23          0
strelka            41         12         54

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka               0         12         23
strelka            54         41         12

SQL> EXEC P1

PL/SQL procedure successfully completed.

SQL> SELECT  *
  2    FROM  TABLE1
  3  /

O_NAME            ONE        TWO      THREE
---------- ---------- ---------- ----------
belka              23          0         12
strelka            12         54         41

SQL>


Только все это от ненормализованного дизайна. Создай таблицы:

TABLE1: NAME_ID, NAME
TABLE2: NAME_ID,VALUE_ID,VALUE

и будет тебе счастье.

SY.
10 сен 16, 16:13    [19650557]     Ответить | Цитировать Сообщить модератору
 Re: Получение данных по индексу колонки  [new]
Mordozz
Member

Откуда:
Сообщений: 4
SY, Премного благодарен за столь исчерпывающий ответ.
13 сен 16, 08:24    [19657295]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить