powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вызов pls sql из sql (функция в запросе)
18 сообщений из 18, страница 1 из 1
вызов pls sql из sql (функция в запросе)
    #39312752
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)

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


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

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

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

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

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

На операторы (CREATE OPERATOR), кстати, это не распространяется.
Ну и уровень изоляции READ ONLY/SERIALIZABLE тоже помогает.
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39312774
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевleggи в конце концов - это специально сделано и правильно,
Сдается мне Вы уже дозрели до уровней изоляции транзакций и подобной сложной ерунды (READ COMMITED, SERIALIZABLE, READ ONLY TRANSACTION). Почитайте.
как ни странно читал) . м.б. не в коня корм, дурака учить тока портить. просто всегда считал, что select и есть транзакция чтения, все что он дергает - (ф-ции) работают в рамках этой транзакции. оказывается ни разу. так выходит две идентичные ф-ции в одном запросе могут вернуть разные результаты так что ли?
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39312776
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leggтехническая особенность?plsql это фактически клиент БД. Соответственно, нет связи с моментом начала родительского запроса, а каждый внутри-запрос выполняется в соответствии с типом транзакции.
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39312777
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов pls sql из sql (функция в запросе)
    #39312784
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровПри обычном (Read commited) уровне изоляции вполне возможно. Вызванные из SQL-оператора PL/SQL функции работают со своим snapshot SCN, отличающимся от SCN родительского запроса

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

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

На операторы (CREATE OPERATOR), кстати, это не распространяется.
Ну и уровень изоляции READ ONLY/SERIALIZABLE тоже помогает.
при сериализэйбл - это мне понятно. удивлен, что он тут необходим, оказывается.
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39312788
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов pls sql из sql (функция в запросе)
    #39312790
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСобственно, кроме тормозов (переключение контекста, в частности) это является еще одним критерием нежелательности вызова PL/SQL кода из SQL оператора.

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

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

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

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

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

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

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

Был бы у Вас Постгрес - там бы вопроса и не стояло, там даже одну операцию не стараюся привести к одному моменту времени. :)
более менее понял. всегда считал, что select и все что он дергает работают по единому снимку. еще надо перечитать доку по ссылке Елика (большое спасибо еще раз ему). Спасибо за разъяснения. Хорошо что хоть ща узнал. Лучше поздно, чем никогда.
и все таки. цепляясь к мелочам - в данном случае выходит, что селект - несколько последовательных операций чтения, не объединенных в единую транзакцию. транзакция хоть и разнесена по времени, но игнорирует все транзакции, которые выполнились после ее начала. в данном случае такого не происходит. объединять селект в транзакцию нужно принудительно. или я опять чушь несу?
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39313001
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов pls sql из sql (функция в запросе)
    #39313028
andreymxругнётся ли функция ноу_дата_фаундом в запросе?зачем?
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39313055
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов pls sql из sql (функция в запросе)
    #39313070
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов pls sql из sql (функция в запросе)
    #39313072
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leggandreymxпропущено...
ругнётся ли функция ноу_дата_фаундом в запросе?
Да.проверенно собственным лбом
З.ы. встретилось в поделке небезысвестной компании цфт.
...
Рейтинг: 0 / 0
вызов pls sql из sql (функция в запросе)
    #39313132
leggandreymxругнётся ли функция ноу_дата_фаундом в запросе?
Да.проверенно собственным лбомпродемонстрируй
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вызов pls sql из sql (функция в запросе)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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