Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вызов pls sql из sql (функция в запросе) / 18 сообщений из 18, страница 1 из 1
21.09.2016, 15:07:18
    #39312752
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
к крайнему своему стыду только сегодня узнал, что в запросе вида
Код: plsql
1.
2.
3.
select myfunc(id), id 
from tbl 
where id = 1

при
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace myfunc(nid  number)
return number
is
   nsomeparam number(1);
begin
   select 1 into nsomeparam from tbl where id = nid;
   return  nsomeparam;
end;


возможна ситуация, когда myfunc ругнется no_data_found - при удалении в другой сессии записи из tbl с id = 1 в момент запроса (но до того, как отработала myfunc)

после этого открытия мне резко поплохело и я теперь вообще ничего не понимаю.
поясните, пожалуйста, возможна ли ситуация, когда две идентичные функции myfunc и myfunc2 в запросе
Код: plsql
1.
2.
3.
select myfunc(id), myfunc2(id),  id 
from tbl 
where id = 1


вернут разные результаты (делет прошел после отработки myfunc но до отработки myfunc2)?

есть ли разница, откуда пришел запрос - из клиента непосредственно или описан в некой хранимой процедуре? разве данная особенность не имеет отношения к понятию "нарушение целостности данных"?

и в конце концов - это специально сделано и правильно, или просто техническая особенность? баг или фича?
...
Рейтинг: 0 / 0
21.09.2016, 15:17:52
    #39312764
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggи в конце концов - это специально сделано и правильно,
Сдается мне Вы уже дозрели до уровней изоляции транзакций и подобной сложной ерунды (READ COMMITED, SERIALIZABLE, READ ONLY TRANSACTION). Почитайте.
...
Рейтинг: 0 / 0
21.09.2016, 15:20:45
    #39312773
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
При обычном (Read commited) уровне изоляции вполне возможно. Вызванные из SQL-оператора PL/SQL функции работают со своим snapshot SCN, отличающимся от SCN родительского запроса

Собственно, кроме тормозов (переключение контекста, в частности) это является еще одним критерием нежелательности вызова PL/SQL кода из SQL оператора.

Некоторые, кстати, это используют.

На операторы (CREATE OPERATOR), кстати, это не распространяется.
Ну и уровень изоляции READ ONLY/SERIALIZABLE тоже помогает.
...
Рейтинг: 0 / 0
21.09.2016, 15:21:40
    #39312774
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
Сергей Арсеньевleggи в конце концов - это специально сделано и правильно,
Сдается мне Вы уже дозрели до уровней изоляции транзакций и подобной сложной ерунды (READ COMMITED, SERIALIZABLE, READ ONLY TRANSACTION). Почитайте.
как ни странно читал) . м.б. не в коня корм, дурака учить тока портить. просто всегда считал, что select и есть транзакция чтения, все что он дергает - (ф-ции) работают в рамках этой транзакции. оказывается ни разу. так выходит две идентичные ф-ции в одном запросе могут вернуть разные результаты так что ли?
...
Рейтинг: 0 / 0
21.09.2016, 15:22:12
    #39312776
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggтехническая особенность?plsql это фактически клиент БД. Соответственно, нет связи с моментом начала родительского запроса, а каждый внутри-запрос выполняется в соответствии с типом транзакции.
...
Рейтинг: 0 / 0
21.09.2016, 15:22:27
    #39312777
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggесть ли разница, откуда пришел запрос - из клиента непосредственно или описан в некой хранимой процедуре? разве данная особенность не имеет отношения к понятию "нарушение целостности данных"?

и в конце концов - это специально сделано и правильно, или просто техническая особенность? баг или фича?RTFM Read Consistency in the Read Committed Isolation Level (FAQ) :
Database ConceptsIf a SELECT list contains a PL/SQL function, then the database applies statement-level read consistency at the statement level for SQL run within the PL/SQL function code, rather than at the parent SQL level.STFF operator vs function
...
Рейтинг: 0 / 0
21.09.2016, 15:31:12
    #39312784
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
Вячеслав ЛюбомудровПри обычном (Read commited) уровне изоляции вполне возможно. Вызванные из SQL-оператора PL/SQL функции работают со своим snapshot SCN, отличающимся от SCN родительского запроса

Собственно, кроме тормозов (переключение контекста, в частности) это является еще одним критерием нежелательности вызова PL/SQL кода из SQL оператора.

Некоторые, кстати, это используют.

На операторы (CREATE OPERATOR), кстати, это не распространяется.
Ну и уровень изоляции READ ONLY/SERIALIZABLE тоже помогает.
при сериализэйбл - это мне понятно. удивлен, что он тут необходим, оказывается.
...
Рейтинг: 0 / 0
21.09.2016, 15:33:15
    #39312788
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
Elicleggесть ли разница, откуда пришел запрос - из клиента непосредственно или описан в некой хранимой процедуре? разве данная особенность не имеет отношения к понятию "нарушение целостности данных"?

и в конце концов - это специально сделано и правильно, или просто техническая особенность? баг или фича?RTFM Read Consistency in the Read Committed Isolation Level (FAQ) :
Database ConceptsIf a SELECT list contains a PL/SQL function, then the database applies statement-level read consistency at the statement level for SQL run within the PL/SQL function code, rather than at the parent SQL level.STFF operator vs function
огромное спасибо. то что надо. не понимаю как эта информация раньше мимо меня прошла.. так все-таки получается, что по разному ф-ции отработать могут?
...
Рейтинг: 0 / 0
21.09.2016, 15:38:47
    #39312790
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
Вячеслав ЛюбомудровСобственно, кроме тормозов (переключение контекста, в частности) это является еще одним критерием нежелательности вызова PL/SQL кода из SQL оператора.

как все запущено..вообще ничего не знал о подобной нежелательности...
...
Рейтинг: 0 / 0
21.09.2016, 15:52:13
    #39312804
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggпросто всегда считал, что select и есть транзакция чтения
В этом и заблуждение.
select -это операция.
Транзакция это множество операций.

И да если явно не указано, то Oracle не старается привести все операции одной транзакции к одному моменту времени.

Был бы у Вас Постгрес - там бы вопроса и не стояло, там даже одну операцию не стараюся привести к одному моменту времени. :)
...
Рейтинг: 0 / 0
21.09.2016, 16:04:56
    #39312816
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
Сергей Арсеньевleggпросто всегда считал, что select и есть транзакция чтения
В этом и заблуждение.
select -это операция.
Транзакция это множество операций.

И да если явно не указано, то Oracle не старается привести все операции одной транзакции к одному моменту времени.

Был бы у Вас Постгрес - там бы вопроса и не стояло, там даже одну операцию не стараюся привести к одному моменту времени. :)
более менее понял. всегда считал, что select и все что он дергает работают по единому снимку. еще надо перечитать доку по ссылке Елика (большое спасибо еще раз ему). Спасибо за разъяснения. Хорошо что хоть ща узнал. Лучше поздно, чем никогда.
...
Рейтинг: 0 / 0
21.09.2016, 17:04:29
    #39312888
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggСергей Арсеньевпропущено...

В этом и заблуждение.
select -это операция.
Транзакция это множество операций.

И да если явно не указано, то Oracle не старается привести все операции одной транзакции к одному моменту времени.

Был бы у Вас Постгрес - там бы вопроса и не стояло, там даже одну операцию не стараюся привести к одному моменту времени. :)
более менее понял. всегда считал, что select и все что он дергает работают по единому снимку. еще надо перечитать доку по ссылке Елика (большое спасибо еще раз ему). Спасибо за разъяснения. Хорошо что хоть ща узнал. Лучше поздно, чем никогда.
и все таки. цепляясь к мелочам - в данном случае выходит, что селект - несколько последовательных операций чтения, не объединенных в единую транзакцию. транзакция хоть и разнесена по времени, но игнорирует все транзакции, которые выполнились после ее начала. в данном случае такого не происходит. объединять селект в транзакцию нужно принудительно. или я опять чушь несу?
...
Рейтинг: 0 / 0
21.09.2016, 22:01:50
    #39313001
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggк крайнему своему стыду только сегодня узнал, что в запросе вида
Код: plsql
1.
2.
3.
select myfunc(id), id 
from tbl 
where id = 1

при
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace myfunc(nid  number)
return number
is
   nsomeparam number(1);
begin
   select 1 into nsomeparam from tbl where id = nid;
   return  nsomeparam;
end;


возможна ситуация, когда myfunc ругнется no_data_found - при удалении в другой сессии записи из tbl с id = 1 в момент запроса (но до того, как отработала myfunc)ругнётся ли функция ноу_дата_фаундом в запросе?
...
Рейтинг: 0 / 0
21.09.2016, 23:29:39
    #39313028
вызов pls sql из sql (функция в запросе)
andreymxругнётся ли функция ноу_дата_фаундом в запросе?зачем?
...
Рейтинг: 0 / 0
22.09.2016, 02:33:47
    #39313055
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggВячеслав ЛюбомудровСобственно, кроме тормозов (переключение контекста, в частности) это является еще одним критерием нежелательности вызова PL/SQL кода из SQL оператора.

как все запущено..вообще ничего не знал о подобной нежелательности...Не, ну не настолько все плохо
Если PL/SQL функция не лезет в БД (не вызывает в свою очередь SQL), то как бы и хрен с ним, тут главное уменьшить кол-во вызовов.
А вот то, что каждый SQL внутри PL/SQL имеет свой стартовый SCN может приводить к странным, трудноповторимым и трудноуловимым ошибкам
Особенно это обидно, когда что-то уже полностью оттестировано, проверено и результату доверяют.

PS. Если функция, вызванная из SQL выкинет NO_DATA_FOUND, то это будет засчитано как возврат NULL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
tst> create table t1 as select rownum a from dual connect by level <= 10;

Table created.

tst> create function f1(a number) return number as
  2        r number;
  3  begin select t1.a into r from t1 where t1.a=f1.a;
  4        dbms_lock.sleep(1);
  5        return r;
  6  end;
  7  /

Function created.

tst> delete from t1 where a=8;

1 row deleted.

2 сессия
Код: plsql
1.
2.
3.
tst1> set null <Null>
tst1> select a, f1(a) from t1;
-- ждемс

1 сессия
Код: plsql
1.
2.
3.
tst> commit;

Commit complete.

2 сессия
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
         A      F1(A)
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          5
         6          6
         7          7
         8 <Null>
         9          9
        10         10

10 rows selected.

...
Рейтинг: 0 / 0
22.09.2016, 06:19:46
    #39313070
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
andreymxleggк крайнему своему стыду только сегодня узнал, что в запросе вида
Код: plsql
1.
2.
3.
select myfunc(id), id 
from tbl 
where id = 1

при
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace myfunc(nid  number)
return number
is
   nsomeparam number(1);
begin
   select 1 into nsomeparam from tbl where id = nid;
   return  nsomeparam;
end;


возможна ситуация, когда myfunc ругнется no_data_found - при удалении в другой сессии записи из tbl с id = 1 в момент запроса (но до того, как отработала myfunc)ругнётся ли функция ноу_дата_фаундом в запросе?
Да.проверенно собственным лбом
...
Рейтинг: 0 / 0
22.09.2016, 06:25:43
    #39313072
legg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов pls sql из sql (функция в запросе)
leggandreymxпропущено...
ругнётся ли функция ноу_дата_фаундом в запросе?
Да.проверенно собственным лбом
З.ы. встретилось в поделке небезысвестной компании цфт.
...
Рейтинг: 0 / 0
22.09.2016, 09:31:31
    #39313132
вызов pls sql из sql (функция в запросе)
leggandreymxругнётся ли функция ноу_дата_фаундом в запросе?
Да.проверенно собственным лбомпродемонстрируй
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вызов pls sql из sql (функция в запросе) / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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