Курсоры используются, когда Ваш запрос Select возвращает несколько строк. Так, скорее с помощью курсора в случае, если то, когда Вы хотите, агрегируется или единственный rowdata, Вы могли использовать процедуру/функцию без курсора также как
Create Procedure sample(id
varchar2(20))as
Select count(*) into x from table
where
Userid=id;
End ;
И затем просто назвать процедуру
Begin
sample(20);
End
, Это - фактическое использование процедуры/функции, главным образом переносящейся и хранящей запросы, которые сложны, или это требует повторенного управления с теми же логическими, но различными данными
Это зависит от того, для чего Вы нуждаетесь в результате.
, Если Вы уверены, что там будет только 1 строкой, используйте неявный курсор:
DECLARE
v_foo foobar.foo%TYPE;
v_bar foobar.bar%TYPE;
BEGIN
SELECT foo,bar FROM foobar INTO v_foo, v_bar;
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar);
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- No rows selected, insert your exception handler here
WHEN TOO_MANY_ROWS THEN
-- More than 1 row seleced, insert your exception handler here
END;
, Если Вы хотите выбрать больше чем 1 строку, можно использовать любого явный курсор:
DECLARE
CURSOR cur_foobar IS
SELECT foo, bar FROM foobar;
v_foo foobar.foo%TYPE;
v_bar foobar.bar%TYPE;
BEGIN
-- Open the cursor and loop through the records
OPEN cur_foobar;
LOOP
FETCH cur_foobar INTO v_foo, v_bar;
EXIT WHEN cur_foobar%NOTFOUND;
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar);
END LOOP;
CLOSE cur_foobar;
END;
или использование другой тип курсора:
BEGIN
-- Open the cursor and loop through the records
FOR v_rec IN (SELECT foo, bar FROM foobar) LOOP
-- Print the foo and bar values
dbms_output.put_line('foo=' || v_rec.foo || ', bar=' || v_rec.bar);
END LOOP;
END;
От анонимного блока? Я хотел бы теперь больше о ситуации, где Вы думаете, что, чтобы требоваться, потому что с пунктами факторинга подзапроса и встроенными представлениями довольно редко, чтобы Вы обратились к МН / SQL для чего-либо кроме самых сложных ситуаций.
, Если можно использовать именованную процедуру тогда, используют конвейерные функции. Вот пример, который вытягивают из документации:
CREATE PACKAGE pkg1 AS
TYPE numset_t IS TABLE OF NUMBER;
FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED;
END pkg1;
/
CREATE PACKAGE BODY pkg1 AS
-- FUNCTION f1 returns a collection of elements (1,2,3,... x)
FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS
BEGIN
FOR i IN 1..x LOOP
PIPE ROW(i);
END LOOP;
RETURN;
END;
END pkg1;
/
-- pipelined function is used in FROM clause of SELECT statement
SELECT * FROM TABLE(pkg1.f1(5));
Создайте функцию в пакете и возвратите SYS_REFCURSOR:
FUNCTION Function1 return SYS_REFCURSOR IS
l_cursor SYS_REFCURSOR;
BEGIN
open l_cursor for SELECT foo,bar FROM foobar;
return l_cursor;
END Function1;