powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получение данных по индексу колонки
9 сообщений из 9, страница 1 из 1
Получение данных по индексу колонки
    #39306701
Mordozz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую застрял с написанием запроса.
Есть таблица следующей структуры

name|one|two|three

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

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

Сразу оговорюсь что делается это для внедрение Dynamic SQL
...
Рейтинг: 0 / 0
Получение данных по индексу колонки
    #39306748
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди делятся на тех, кто умеет читать документацию,
Кто умеет задавать вопросы,
И тех, кому нужен динамический sql.
...
Рейтинг: 0 / 0
Получение данных по индексу колонки
    #39306754
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-...И тех, кому нужен динамический sql.
Я сначала обиделся, потом подумал, что Вы наверное не про меня говорите )))
...
Рейтинг: 0 / 0
Получение данных по индексу колонки
    #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
Получение данных по индексу колонки
    #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
Получение данных по индексу колонки
    #39306941
Mordozz,

разложи в ряд и соедини обратно. но вот беда, получить поля динамически не проблема, да в общем-то и статически звездочку в метаструктурирлванный набор не приблема. но вот получить обратно динамическое поколонство можно только через одцитаблядство. оно действительно нужно? задача-то адекватно решаема только для однотипа.
ну и для студентов, не желающих учиться, есть форум работа.
...
Рейтинг: 0 / 0
Получение данных по индексу колонки
    #39307002
Mordozz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax.., Хотелось бы получить следующее
column_name|Column_id|name |value
one | 2 |belka | 23
one | 2 |strelka | 12
...
Рейтинг: 0 / 0
Получение данных по индексу колонки
    #39307066
Фотография 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
Получение данных по индексу колонки
    #39308124
Mordozz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, Премного благодарен за столь исчерпывающий ответ.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получение данных по индексу колонки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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