Действительно ли возможно произвести оператор SELECT от МН блока / блока SQL?

58
задан Dominik 12 September 2018 в 11:21
поделиться

4 ответа

Курсоры используются, когда Ваш запрос Select возвращает несколько строк. Так, скорее с помощью курсора в случае, если то, когда Вы хотите, агрегируется или единственный rowdata, Вы могли использовать процедуру/функцию без курсора также как

  Create Procedure sample(id 
    varchar2(20))as 
    Select count(*) into x from table 
    where 
       Userid=id;
     End ;

И затем просто назвать процедуру

   Begin
   sample(20);
   End

, Это - фактическое использование процедуры/функции, главным образом переносящейся и хранящей запросы, которые сложны, или это требует повторенного управления с теми же логическими, но различными данными

0
ответ дан 24 November 2019 в 18:54
поделиться

Это зависит от того, для чего Вы нуждаетесь в результате.

, Если Вы уверены, что там будет только 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;
39
ответ дан Sergey Stadnik 24 November 2019 в 18:54
поделиться

От анонимного блока? Я хотел бы теперь больше о ситуации, где Вы думаете, что, чтобы требоваться, потому что с пунктами факторинга подзапроса и встроенными представлениями довольно редко, чтобы Вы обратились к МН / 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));
8
ответ дан David Aldridge 24 November 2019 в 18:54
поделиться

Создайте функцию в пакете и возвратите 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;
8
ответ дан zygimantus 24 November 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: