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

Откуда:
Сообщений: 29
Доброго всем времени суток.
Не поможет ли мне кто, пожалуйста, разрешить такую вот проблему (возможно, есть ссылки что почитать):
Есть:
 create or replace type data_type as object
   (ID number [, ...еще есть поля...] );
 create or replace type table_type as table of data_type;
В процедуре объявлено:
  l_data table_type := table_type();
Дальше я заполняю это объектную таблицу и пытаюсь из нее выбрать и вставить записи в другую таблицу. Запрос составляю динамически, т.к. имя таблицы для вставки может меняться. Что-то вроде этого:
execute immediate 'insert into ' || my_table || ' 
          (id [,...])
    select ld.id [,...]
    from table (cast ( l_data as form_table_type)) ld';
И вот, при выполнении этой процедуры, в запросе INSERT возникает ошибка:
ORA-00904: "L_DATA": invalid identifier.
Это что значит, что такая переменная не видна? Или в чем-то еще ошибка?
Если прямо писать запрос, без динамического формирования строки - то работает. А в таком виде - нет. Можно ли как-то подставить эту l_data в запрос?
Oracle 9.2.0.6, вызываю из приложения на C#.
Спасибо.
26 дек 07, 15:37    [5099597]     Ответить | Цитировать Сообщить модератору
 Re: видимость объектного типа в динамическом запросе  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
kbowner

Это что значит, что такая переменная не видна?


Разумеется. С какого перепуга ей быть видимой в контексте SQL, если это переменная PL ? ?

kbowner

Можно ли как-то подставить эту l_data в запрос?


SQL> declare
  2   a table_type := table_type(data_type(1), data_type(2));
  3   x sys_refcursor;
  4   s int;
  5  begin
  6   open x for 'select id from table(cast(:a as table_type))' using a;
  7   loop
  8     fetch x into s;
  9     exit when x%notfound;
 10     dbms_output.put_line(s);
 11   end loop;
 12   close x;
 13  end;
 14  /
1
2

PL/SQL procedure successfully completed.
26 дек 07, 15:44    [5099652]     Ответить | Цитировать Сообщить модератору
 Re: видимость объектного типа в динамическом запросе  [new]
kbowner
Member

Откуда:
Сообщений: 29
Спасибо вам за ответ.
Жаль, конечно...
Но, наверное, будет быстрее тогда сделать if и проверять таблицы - их у меня всего штук 8. И выполнять какой надо запрос без динамического формирования строки, чем в цикле вставку делать. Собственно, ради этого - избавиться от построчной записи - и затевалось все. В таблице около 8 млн. записей, и таблица еще растет и растет. Секционированная она, конечно, но операции вставки/изменения происходят очень часто и отнимают очень много времени.
26 дек 07, 15:57    [5099731]     Ответить | Цитировать Сообщить модератору
 Re: видимость объектного типа в динамическом запросе  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
А почему в цикле?У Вас вроде инсерт не в цикле идет?
26 дек 07, 16:00    [5099757]     Ответить | Цитировать Сообщить модератору
 Re: видимость объектного типа в динамическом запросе  [new]
kbowner
Member

Откуда:
Сообщений: 29
Сори, я наверное, не понял сразу предложенную идею...
Судя по всему, если написать
execute immediate 'insert into [...] .. :L_DATA ' using L_DATA
, то все работает...
Сейчас проверю еще.
Спасибо.
26 дек 07, 17:01    [5100222]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить