[SQL] 어떻게 저장 프로 시저에서 여러 행을 반환? (오라클 PL / SQL)
SQL어떻게 저장 프로 시저에서 여러 행을 반환? (오라클 PL / SQL)
나는 인수에 따라 기록의 다른 세트를 반환 한 인수를 저장 프로 시저를 만들려고합니다. 이 작업을 수행 할 수있는 방법은 무엇입니까? 나는 일반 SQL에서 호출 할 수 있습니까?
해결법
-
==============================
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.난 당신이 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.당신은 오라클이 기능을 파이프 라인 사용할 수 있습니다
당신은 오라클이 기능을 파이프 라인 사용할 수 있습니다
간단한 예 - 일부 임의의 데이터를 생성 당신은 어떻게 입력 인수에 따라 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.당신은 일반 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.
create procedure <procedure_name>(p_cur out sys_refcursor) as begin open p_cur for select * from <table_name> end;
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
'SQL' 카테고리의 다른 글
[SQL] EXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0 (0) | 2020.04.18 |
---|---|
[SQL] SQL보기 : 전체 이름 필드에서, 첫 번째 중간 이름과 성을 구문 분석 (0) | 2020.04.18 |
[SQL] JPQL IN 절 : 자바 배열 (또는 목록, 설정 ...)? (0) | 2020.04.17 |
[SQL] 영구적으로 설정 PostgreSQL을 스키마 경로 (0) | 2020.04.17 |
[SQL] 범위 경계를 포함하는 "사이"합니까 MS SQL 서버? (0) | 2020.04.17 |