результат курсора определяется во время открытия ? но следующая демонстрация показывает разницу:
drop table Highschooler;
drop table w;
create table Highschooler( grade int );
create table w( grade int );
insert into Highschooler(grade) values (13);
insert into Highschooler(grade) values(14);
insert into Highschooler(grade) values (15);
insert into w values (16);
select * from Highschooler;
select * from w;
create or replace create function ff(a int) return int is
total int := 0;
begin
select count(grade) into total from w where grade > a ;
return total;
end;
DECLARE
my_var int :=0;
my_var2 int := 0;
my_var3 int := 0;
CURSOR CC IS select ff(grade) from Highschooler for update;
BEGIN
open CC;
fetch CC into my_var;
insert into w values (16);
fetch CC into my_var2;
fetch CC into my_var3;
dbms_output.put_line(my_var || ' - ' || my_var2 || ' - ' || my_var3);
close CC;
end;
выходы:
GRADE
13
14
15
Download CSV
3 rows selected.
Result Set 4
GRADE
16
Statement processed. ------- the insert stmt in 'insert into w values (16);' affect the cursor's output here
1 - 2 - 2
Ваша функция содержит еще один курсор, который открывается только во время выполнения. Вот почему обычно не следует использовать функции только для выполнения SQL — в итоге вы получите логически поврежденные данные, поскольку каждое выполнение будет использовать другую точку SCN.
выполнение курсора завершилось, когда его открытый курсор вернулся? если это так, функция в курсоре также завершается. если нет, курсор продолжит свое выполнение после открытия, пока он не будет закрыт? или функция, вызываемая только для каждого результата курсора, была извлечена? если это причина, почему результат курсора не набор результатов select stmt, а значение перед вызовом функции? спасибо за ответ :)
Определите курсор без использования функции, такой как
CURSOR CC IS
select (select count(grade) from w where grade > h.grade) as ff
from Highschooler h;
Это приведет к ожидаемому результату
1 - 1 - 1
Также обратите внимание, что отказ от использования функций приведет к повышению производительности, поскольку вы опускаете переключение контекста.
да, что меня смущает, так это использование функции, влияющей на результат, когда курсор был изменен
Не могли бы вы свести свой пример только к соответствующей части, то есть к одной таблице с одной вставкой и выборкой курсора, и описать более подробно, какую разницу вы заметили?