복붙노트

[SQL] 어떻게 저장 프로 시저에서 여러 행을 반환? (오라클 PL / SQL)

SQL

어떻게 저장 프로 시저에서 여러 행을 반환? (오라클 PL / SQL)

나는 인수에 따라 기록의 다른 세트를 반환 한 인수를 저장 프로 시저를 만들려고합니다. 이 작업을 수행 할 수있는 방법은 무엇입니까? 나는 일반 SQL에서 호출 할 수 있습니까?

해결법

  1. ==============================

    1.여기가 테이블 인 것처럼 조회 할 수있는 결과 집합을 반환하는 함수를 작성하는 방법입니다 :

    여기가 테이블 인 것처럼 조회 할 수있는 결과 집합을 반환하는 함수를 작성하는 방법입니다 :

    SQL> create type emp_obj is object (empno number, ename varchar2(10));
      2  /
    
    Type created.
    
    SQL> create type emp_tab is table of emp_obj;
      2  /
    
    Type created.
    
    SQL> create or replace function all_emps return emp_tab
      2  is
      3     l_emp_tab emp_tab := emp_tab();
      4     n integer := 0;
      5  begin
      6     for r in (select empno, ename from emp)
      7     loop
      8        l_emp_tab.extend;
      9        n := n + 1;
     10       l_emp_tab(n) := emp_obj(r.empno, r.ename);
     11     end loop;
     12     return l_emp_tab;
     13  end;
     14  /
    
    Function created.
    
    SQL> select * from table (all_emps);
    
         EMPNO ENAME
    ---------- ----------
          7369 SMITH
          7499 ALLEN
          7521 WARD
          7566 JONES
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7788 SCOTT
          7839 KING
          7844 TURNER
          7902 FORD
          7934 MILLER
    
  2. ==============================

    2.난 당신이 REFCURSOR을 반환 할 생각 :

    난 당신이 REFCURSOR을 반환 할 생각 :

    create function test_cursor 
                return sys_refcursor
                is
                        c_result sys_refcursor;
                begin
                        open c_result for
                        select * from dual;
                        return c_result;
                end;
    

    업데이트 : 당신이 SQL에서이 전화를해야하는 경우, @Tony 앤드류스 같은 테이블 함수가 제안 사용합니다.

  3. ==============================

    3.당신은 오라클이 기능을 파이프 라인 사용할 수 있습니다

    당신은 오라클이 기능을 파이프 라인 사용할 수 있습니다

    간단한 예 - 일부 임의의 데이터를 생성 당신은 어떻게 입력 인수에 따라 N 고유 한 난수를 만들 수 있을까?

    create type array
    as table of number;
    
    
    create function  gen_numbers(n in number default null)
    return array
    PIPELINED
    as
    begin
      for i in 1 .. nvl(n,999999999)
      loop
         pipe row(i);
     end loop;
     return;
    end;
    

    우리가 뭔가를 세 행을 필요로 가정하자. 우리는 지금 두 가지 방법 중 하나로이 작업을 수행 할 수 있습니다

    select * from TABLE(gen_numbers(3));
    

    COLUMN_VALUE

           1
           2
           3
    

    또는

    select * from TABLE(gen_numbers)
     where rownum <= 3;
    

    COLUMN_VALUE

           1
           2
           3
    

    파이프 라인 기능 (1) 파이프 라인 기능 2

  4. ==============================

    4.당신은 일반 SQL에서 사용하려면, 내가 저장 프로 시저가 결과 행이 테이블이나 임시 테이블을 채울 수 있도록 (또는 @Tony 앤드류스 접근 이동)한다. 당신이 틸로의 솔루션 @ 사용하려면, 당신은 루프에 PL / SQL을 사용하여 커서를 가지고있다. 예를 들어 여기 (@Thilo했던 것처럼 내가 대신 함수의 프로 시저를 사용)

    당신은 일반 SQL에서 사용하려면, 내가 저장 프로 시저가 결과 행이 테이블이나 임시 테이블을 채울 수 있도록 (또는 @Tony 앤드류스 접근 이동)한다. 당신이 틸로의 솔루션 @ 사용하려면, 당신은 루프에 PL / SQL을 사용하여 커서를 가지고있다. 예를 들어 여기 (@Thilo했던 것처럼 내가 대신 함수의 프로 시저를 사용)

    create or replace procedure myprocedure(retval in out sys_refcursor) is
    begin
      open retval for
        select TABLE_NAME from user_tables;
    end myprocedure;
    
     declare 
       myrefcur sys_refcursor;
       tablename user_tables.TABLE_NAME%type;
     begin
       myprocedure(myrefcur);
       loop
         fetch myrefcur into tablename;
         exit when myrefcur%notfound;
         dbms_output.put_line(tablename);
       end loop;
       close myrefcur;
     end;
    
  5. ==============================

    5.

    create procedure <procedure_name>(p_cur out sys_refcursor) as begin open p_cur for select * from <table_name> end;
    
  6. from https://stackoverflow.com/questions/101033/how-to-return-multiple-rows-from-the-stored-procedure-oracle-pl-sql by cc-by-sa and MIT license