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

Откуда: Москва
Сообщений: 360
Доброго всем дня.
Подскажите, пожалуйста, конструкция работает и возвращает все записи, но что-то заставляет меня сомневаться. Может ли она хотя бы теоретически выстрелить?
open cur for select * from table(collection);
collection.delete;
return cur;
24 апр 14, 13:33    [15928837]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
А как коллекция в запрос передается - COPY или NOCOPY?
24 апр 14, 13:38    [15928880]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Elic
Member

Откуда:
Сообщений: 29980
Batsall
возвращает все записи
Сколько?
24 апр 14, 13:45    [15928948]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Batsall
Member

Откуда: Москва
Сообщений: 360
andreymx
А как коллекция в запрос передается - COPY или NOCOPY?

Коллекция объявлена на уровне пакета, собирается в другом методе пакета. Дополнительных опций не указано.
Elic
Batsall
возвращает все записи
Сколько?

Из курсора удается прочитать все записи, которые сложены в коллекцию.
24 апр 14, 14:00    [15929073]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Alexei_Unregistered
Guest
andreymx
А как коллекция в запрос передается - COPY или NOCOPY?


В SQL данные из PL/SQL всегда передаются методом COPY
при связывании (binding-е). После binding исходные данные
в PL/SQL переменных (в т.ч. коллекциях) можно менять
сколько угодно, на выполнение SQL это не влияет.

Алексей.
24 апр 14, 14:09    [15929154]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Elic
Member

Откуда:
Сообщений: 29980
Batsall
Из курсора удается прочитать все записи, которые сложены в коллекцию.
Elic
Сколько?
24 апр 14, 14:16    [15929203]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Batsall
Member

Откуда: Москва
Сообщений: 360
Elic
Batsall
Из курсора удается прочитать все записи, которые сложены в коллекцию.
Elic
Сколько?
Сколько на вход пришло. Около 100.
24 апр 14, 14:31    [15929325]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
Batsall
Elic
пропущено...
пропущено...
Сколько на вход пришло. Около 100.
проверь на пяти тыщах
24 апр 14, 14:47    [15929445]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Batsall
Member

Откуда: Москва
Сообщений: 360
andreymx
Batsall
пропущено...
Сколько на вход пришло. Около 100.
проверь на пяти тыщах

Могу и проверить. А что мы хотим увидеть?
24 апр 14, 15:17    [15929751]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Elic
Member

Откуда:
Сообщений: 29980
Batsall
Могу и проверить.
Ну не нам же за тебя проверять.
Batsall
А что мы хотим увидеть?
Мы ничего. А вот ты - подтверждение своих сомнений.
24 апр 14, 16:21    [15930399]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Batsall,

SQL> variable v_cur refcursor
SQL> declare
  2      v_NumList NumList := NumList(1,2,3,4,5);
  3  begin
  4      open :v_cur for select * from table(v_NumList);
  5      v_NumList.delete;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> print v_cur

COLUMN_VALUE
------------
           1
           2
           3
           4
           5

SQL> declare
  2      v_NumList NumList := NumList(1,2,3,4,5);
  3  begin
  4      open :v_cur for select * from table(v_NumList);
  5      v_NumList := NumList(10,20,30);
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> print v_cur

COLUMN_VALUE
------------
           1
           2
           3
           4
           5

SQL> 


SY.
24 апр 14, 16:23    [15930420]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Alexei_Unregistered
Guest
Фомы неверующие. Дубль 2.
Реально исполняемый запрос будет выглядеть так:
select * from table(:b1)

Все дело в буферах, в которые данные копируются при биндинге.
После того, как они скопированы, то источник их копирования
вы можете менять как угодно, в т.ч. даже если это коллекции.

Алексей.
24 апр 14, 16:41    [15930612]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
andreymx
А как коллекция в запрос передается - COPY или NOCOPY?


Насколько я понимаю collection в select * from table(collection) как и любая PL/SQL переменная в SQL предложении превращается в bind by value.

SY.
24 апр 14, 16:47    [15930673]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Alexei_Unregistered
Guest
SY
Насколько я понимаю collection в select * from table(collection) как и любая PL/SQL переменная в SQL предложении превращается в bind by value.


Воистину так!
24 апр 14, 16:49    [15930711]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Elic
Member

Откуда:
Сообщений: 29980
Alexei_Unregistered
Воистину так!
Доверяй, но проверяй. Пока - везение.
24 апр 14, 16:51    [15930737]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Alexei_Unregistered
Guest
Elic
Доверяй, но проверяй. Пока - везение.

Это да, от Oracle можно всего ожидать...
Хотя здесь, думаю, все надежно.
Все высокоуровневые интерфейсы работы с БД, с которыми мне довелось
встречаться (PL/SQL, JDBC, OLEDB, ODP.NET и пр.), делают bind bу value,
т.е. копируют данные. Bind by reference я делал только непосредственно
в OCI, как раз для массивов данных, - штука хорошая, но весьма
опасная в плане разных side эффектов, собственно, поэтому она
в высокоуровневых интерфейсах и не используется.

Алексей.
24 апр 14, 17:07    [15930907]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Elic
Доверяй, но проверяй. Пока - везение.


Пока не понял.

SY.
24 апр 14, 17:09    [15930926]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
-2-
Member

Откуда:
Сообщений: 15330
Alexei_Unregistered
Bind by reference я делал только непосредственно
в OCI
А серверу то не пофиг на игры внутри приложения?
24 апр 14, 17:32    [15931078]     Ответить | Цитировать Сообщить модератору
 Re: Очистка коллекции, по которой открыт курсор  [new]
Alexei_Unregistered
Guest
-2-
А серверу то не пофиг на игры внутри приложения?

Серверу пофиг. Он ведомый. Ему что сказали, то он и делает.

Алексей.
25 апр 14, 07:05    [15933055]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить