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

Откуда:
Сообщений: 3719
Подскажите, возможно ли такое?

Есть у меня такой курсор:
  cursor CUR_SVC_AUTO is
    select S.SERVICE_ID, S.TARIFF_ID, ...
    from ...
    where ID.SCOPE = 'yearly-plans' and ID.EXTRA = 'iptv:base'
    and trunc(S.CREATE_DATE) = trunc(sysdate)
    ;
  ROW_SVC_AUTO CUR_SVC_AUTO%ROWTYPE;


И допустим я хочу результаты запроса поместить во вспомогательную таблицу.
Можно это делать в цикле:
  open CUR_SVC_AUTO;
  loop
    fetch CUR_SVC_AUTO into ROW_SVC_AUTO;
    exit when CUR_SVC_AUTO%NOTFOUND;
    insert into table1(id,title) values (ROW_SVC_AUTO."SERVICE_ID", ROW_SVC_AUTO."NAME");
  end loop;
  close CUR_SVC_AUTO;


А можно ли сделать что-то типа такого:
insert into table1 (id, title)
CUR_SVC_AUTO%SQL

где CUR_SVC_AUTO%SQL это SQL-текст курсора.

Я искал по запросу "oracle cursor sql text", вроде бы мне нужно использовать V$SQL и V$SQLTEXT, но не соображу, как это использовать.
Не покажите на примере?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
1 июн 16, 19:26    [19247356]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3719
У меня Oracle 10g, и похоже что V$SQL я использовать не могу.
А есть другие способы?
1 июн 16, 19:31    [19247372]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
ma1tus
Member

Откуда:
Сообщений: 752
Alibek B.,

forall insert
1 июн 16, 20:08    [19247452]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
ma1tus
Member

Откуда:
Сообщений: 752
ma1tus
forall insert
сорри,неправильно понял задачу
1 июн 16, 20:11    [19247467]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3719
Я планировал использовать запрос, как эдакий именованный SQL-запрос, который можно вызывать в разных местах. Но видимо так сделать не получится.
А возможно ли получить набор PK вставленных записей?
SQL-запрос возвращает набор данных, на основе которых я добавляю записи в основную таблицу.
То есть я буду использовать примерно такой запрос:
insert into SERVICES (TYPE_ID, TARIFF_ID, LOGIN, ...)
select ...
from ...

В таблице SERVICES есть PK, который заполняется автоматически (в триггере используется SEQUENCE).
И я не могу придумать, как мне получить список вставленных записей.
В крайнем случае в таблицу SERVICES можно добавить вспомогательное поле, которое будет заполняться в INSERT, по которому я буду отбирать записи для обработки и которое я буду очищать после завершения обработки, но я бы не хотел изменять структуру таблицы.
А можно ли получить список добавленных PK с помощью кляузы returning into?
В диаграмме такой вариант вроде бы есть, но подходящего примера (чтобы и INSERT, и BULK COLLECT) я не нашел. Причем судя по тому, что тема на форуме уже поднималась, это нормальное поведение. Но может быть можно это как-то обойти?
1 июн 16, 22:37    [19247868]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51751

Alibek B.
Я планировал использовать запрос, как эдакий именованный SQL-запрос,
который можно вызывать в разных местах.

Это называется "view".

Posted via ActualForum NNTP Server 1.5

1 июн 16, 22:41    [19247880]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
Alibek B.,

Returning into clause
1 июн 16, 22:44    [19247892]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
legg
Member

Откуда: Москва
Сообщений: 6599
Alibek B.,

а динамический SQL, т.е. загнать запрос в строковую переменную и дергать уже ее, вас не устроит?
2 июн 16, 09:21    [19248423]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3719
Dimitry Sibiryakov
Это называется "view".

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

проходил мимо...
Returning into clause

Это та же ссылка, на которую я ссылался парой сообщений выше, или я что-то не заметил?

Сейчас я сделал решение через временную таблицу — то есть первым делом результаты запроса с подготовленными данными вношу во временную таблицу, а затем использую эту временную таблицу при добавлении и обновлении данных.
Допустим у меня временная таблица имеет такую структуру: TMP(TYPE_ID number, LOGIN varchar2, ..., SERVICE_ID).

1. Добавляю данные во временную таблицу:
insert into TMP(TYPE_ID,LOGIN) select ... from ...

Здесь service_id не заполняются, поскольку их еще нет.

2. Добавляю в основную таблицу:
    merge into SERVICES D
    using
    (
      select ...
      from TMP ID
      join ...
    ) S
    on (S.TYPE_ID = D.TYPE_ID and S.LOGIN = D.LOGIN)
    when not matched then
      insert ... values ...


3. Вношу во временную таблицу идентификаторы (PK) добавленных записей:
    merge into TMP D
    using SERVICES S
    on (S.TYPE_ID = D.TYPE_ID and S.LOGIN = D.LOGIN)
    when matched then update set D.SERVICE_ID = S.SERVICE_ID;


4. Выполняю остальные действия с использованием временной таблицы.

А возможно ли пункты 1-3 сократить?
Если BULK COLLECT нельзя использовать в INSERT, может быть его можно использовать в MERGE или UPDATE, тем самым объединив пункты 2 и 3?
2 июн 16, 09:24    [19248430]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3719
legg
а динамический SQL, т.е. загнать запрос в строковую переменную и дергать уже ее, вас не устроит?

Динамический SQL усложняет логику программы и затрудняет ее понимание, а мне бы чем проще, тем лучше.
2 июн 16, 09:25    [19248436]     Ответить | Цитировать Сообщить модератору
 Re: А можно ли выполнить SQL курсора?  [new]
pihel
Member

Откуда: СПБ
Сообщений: 160
Alibek B.,


Alibek B.
Представления мне не подходят, часть курсоров/запросов у меня с параметрами.


тогда вам подойдут конвеерные pipeline функции.
2 июн 16, 09:31    [19248456]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить