Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получение данных по индексу колонки / 9 сообщений из 9, страница 1 из 1
09.09.2016, 15:50:49
    #39306701
Mordozz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
Приветствую застрял с написанием запроса.
Есть таблица следующей структуры

name|one|two|three

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

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

Сразу оговорюсь что делается это для внедрение Dynamic SQL
...
Рейтинг: 0 / 0
09.09.2016, 16:32:35
    #39306748
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
Люди делятся на тех, кто умеет читать документацию,
Кто умеет задавать вопросы,
И тех, кому нужен динамический sql.
...
Рейтинг: 0 / 0
09.09.2016, 16:40:06
    #39306754
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
-2-...И тех, кому нужен динамический sql.
Я сначала обиделся, потом подумал, что Вы наверное не про меня говорите )))
...
Рейтинг: 0 / 0
09.09.2016, 18:55:44
    #39306828
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
MordozzПриветствую застрял с написанием запроса.
Есть таблица следующей структуры

name|one|two|three

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
09.09.2016, 20:44:52
    #39306876
Mordozz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
Перейду от общего к частному
Есть одна пользовательская таблица со следующей структурой
Код: plsql
1.
2.
3.
4.
5.
6.
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); и дальше бы происходила инкрементация. Загвоздка для меня в том , чтобы осуществить это необходимо как-то связать пользовательскую таблицу и оракловскую, но по структуре они абсолютно разные . А так как к СУБД я пока что на ВЫ, решил попытать счастья на этом форуме.
...
Рейтинг: 0 / 0
10.09.2016, 00:25:25
    #39306941
Получение данных по индексу колонки
Mordozz,

разложи в ряд и соедини обратно. но вот беда, получить поля динамически не проблема, да в общем-то и статически звездочку в метаструктурирлванный набор не приблема. но вот получить обратно динамическое поколонство можно только через одцитаблядство. оно действительно нужно? задача-то адекватно решаема только для однотипа.
ну и для студентов, не желающих учиться, есть форум работа.
...
Рейтинг: 0 / 0
10.09.2016, 09:52:43
    #39307002
Mordozz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
stax.., Хотелось бы получить следующее
column_name|Column_id|name |value
one | 2 |belka | 23
one | 2 |strelka | 12
...
Рейтинг: 0 / 0
10.09.2016, 16:13:48
    #39307066
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
MordozzЗадача состоит в том , чтобы написать функцию, при которой каждый раз когда обращаешься к ней данные из колонок перезаписывались в последующие

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
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 если по-кругу:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
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.
...
Рейтинг: 0 / 0
13.09.2016, 08:24:31
    #39308124
Mordozz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение данных по индексу колонки
SY, Премного благодарен за столь исчерпывающий ответ.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получение данных по индексу колонки / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]