참조 커서를 반환하는 오라클 프로시저에서 적절한 형식의 결과를 얻는 방법은 무엇입니까?
MS SQL Server에서 저장 프로시저의 결과를 확인하려면 Management Studio에서 다음을 실행합니다.
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
결과 창의 출력은 다음과 같습니다.
ID Title ViewCount Votes
----- ------------------------------------------------- ---------- --------
2165 Indexed View vs Indexes on Table 491 2
5068 SQL Server equivalent to Oracle’s NULLS FIRST 524 3
1261 Benefits Of Using SQL Ordinal Position Notation? 377 2
(3 row(s) affected)
루프 또는 PRINT 문을 작성할 필요가 없습니다.
Oracle에서 동일한 작업을 수행하기 위해 SQL Developer에서 다음 익명 블록을 실행할 수 있습니다.
--ORACLE WAY
DECLARE
OUTPUT MYPACKAGE.refcur_question;
R_OUTPUT MYPACKAGE.r_question;
USER VARCHAR2(20);
BEGIN
dbms_output.enable(10000000);
USER:= 'OMG Ponies';
recordCount := 0;
MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,
p_USER=> USER,
) ;
DBMS_OUTPUT.PUT_LINE('ID | Title | ViewCount | Votes' );
LOOP
FETCH OUTPUT
INTO R_OUTPUT;
DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE
'|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES);
recordCount := recordCount+1;
EXIT WHEN OUTPUT % NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount);
CLOSE OUTPUT;
END;
이 출력은 다음과 같습니다.
ID|Title|ViewCount|Votes
2165|Indexed View vs Indexes on Table|491|2
5068|SQL Server equivalent to Oracle’s NULLS FIRST|524|3
1261|Benefits Of Using SQL Ordinal Position Notation?|377|2
Record Count: 3
따라서 SQL 버전은 1줄이고 오라클은 18줄이며 출력은 추합니다.열이 많거나 데이터가 숫자인 경우 악화됩니다.
이상한 점은 SQL Developer 또는 Management Studio에서 이 문구를 작성하면...
SELECT
ID,
Title,
ViewCount,
Votes
FROM votes where user = 'OMG Ponies'
결과는 상당히 비슷합니다.이것은 제가 기술을 놓치거나 잘못된 도구를 사용하는 것처럼 느끼게 합니다.
한다면GetQuestions는 SQL Server 버전에 있는 것처럼 보이는 Refurcursor를 반환하는 함수입니다. 그러면 다음과 같은 작업을 수행할 수 있습니다.
select * from table(MyPackage.GetQuestions('OMG Ponies'));
또는 PL/SQL 블록에 필요한 경우 커서에서 동일한 선택을 사용할 수 있습니다.
당신은 또한 기능이 다음을 생산하도록 할 수 있습니다.dbms_output명령문 대신 항상 디버깅에 사용할 수 있도록 설정할 수 있습니다. 하지만 이 경우 약간의 오버헤드가 발생합니다.
편집
음, 할 수 있을지 모르겠네요.cast()패키지 외부에 자신의 유형(및 해당 유형의 테이블)을 선언할 의사가 없는 한 사용 가능한 유형으로 반환됩니다.그러나 결과를 덤프하기 위해 이 작업을 수행할 수 있습니다.
create package mypackage as
function getquestions(user in varchar2) return sys_refcursor;
end mypackage;
/
create package body mypackage as
function getquestions(user in varchar2) return sys_refcursor as
r sys_refcursor;
begin
open r for
/* Whatever your real query is */
select 'Row 1' col1, 'Value 1' col2 from dual
union
select 'Row 2', 'Value 2' from dual
union
select 'Row 3', 'Value 3' from dual;
return r;
end;
end mypackage;
/
var r refcursor;
exec :r := mypackage.getquestions('OMG Ponies');
print r;
그리고 통화 결과를 다른 절차나 기능에서 사용할 수 있습니다. PL/SQL 밖에서 통화 결과를 얻는 것은 조금 까다로운 것 같습니다.
추가할 편집 내용:이 접근 방식을 사용하면 절차인 경우 기본적으로 동일한 작업을 수행할 수 있습니다.
var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
SQL Developer는 저장 프로시저를 실행할 때 출력을 자동으로 가져옵니다.프로시저 편집기에서 직접 저장 프로시저를 실행하면 여기 제 게시물에서 이 동작을 자세히 볼 수 있습니다.
이제 SQL 워크시트에서 비블록의 일부로 Refursor를 실행하려면 이와 유사한 작업을 수행할 수 있습니다.
var rc refcursor
exec :rc := GET_EMPS(30)
print rc
--여기서 GET_EMPS()는 sp_GetQuestions('OMG 포니즈') 호출입니다.PRINT 명령은 저장 프로시저를 통해 실행되는 '쿼리'의 출력을 전송하며, 다음과 같습니다.
anonymous block completed
RC
-----------------------------------------------------------------------------------------------------
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- ------------------------- ---------- ---------- -------------- ---------- -------------
114 Den Raphaely DRAPHEAL 515.127.4561 07-DEC-94 12.00.00 PU_MAN 11000 100 30
115 Alexander Khoo AKHOO 515.127.4562 18-MAY-95 12.00.00 PU_CLERK 3100 114 30
116 Shelli Baida SBAIDA 515.127.4563 24-DEC-97 12.00.00 PU_CLERK 2900 114 30
117 Sigal Tobias STOBIAS 515.127.4564 24-JUL-97 12.00.00 PU_CLERK 2800 114 30
118 Guy Himuro GHIMURO 515.127.4565 15-NOV-98 12.00.00 PU_CLERK 2600 114 30
119 Karen Colmenares KCOLMENA 515.127.4566 10-AUG-99 12.00.00 PU_CLERK 2500 114 30
10g이라고 했잖아요.12c의 경우 암시적 커서 결과를 지원하도록 PL/SQL 엔진을 개선했습니다.따라서 커서를 설정할 필요 없이 여기에 문서화된 것처럼 전화를 걸어 데이터를 얻으면 됩니다. http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230
/*
Create Sample Package in HR Schema
*/
CREATE OR REPLACE PACKAGE PRINT_REF_CURSOR
AS
PROCEDURE SP_S_EMPLOYEES_BY_DEPT (
p_DEPARTMENT_ID IN INTEGER,
Out_Cur OUT SYS_REFCURSOR);
END PRINT_REF_CURSOR;
CREATE OR REPLACE PACKAGE BODY PRINT_REF_CURSOR
AS
PROCEDURE SP_S_EMPLOYEES_BY_DEPT (
p_DEPARTMENT_ID IN INTEGER,
Out_Cur OUT SYS_REFCURSOR)
AS
BEGIN
OPEN Out_Cur FOR
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID = p_DEPARTMENT_ID;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.Put_Line('SP_S_EMPLOYEES_BY_DEPT' || ',' || '-20000' || ',' );
WHEN OTHERS
THEN
DBMS_OUTPUT.Put_Line('SP_S_EMPLOYEES_BY_DEPT' || ',' || '-20001' || ',' );
END SP_S_EMPLOYEES_BY_DEPT;
END PRINT_REF_CURSOR;
/*
Fetch values using Ref Cursor and display it in grid.
*/
var RC refcursor;
DECLARE
p_DEPARTMENT_ID NUMBER;
OUT_CUR SYS_REFCURSOR;
BEGIN
p_DEPARTMENT_ID := 90;
OUT_CUR := NULL;
PRINT_REF_CURSOR.SP_S_EMPLOYEES_BY_DEPT ( p_DEPARTMENT_ID, OUT_CUR);
:RC := OUT_CUR;
END;
/
PRINT RC;
/************************************************************************/
언급URL : https://stackoverflow.com/questions/3526798/how-do-you-get-nicely-formatted-results-from-an-oracle-procedure-that-returns-a
'programing' 카테고리의 다른 글
| R로 여러 줄의 댓글을 달 수 있습니까? (0) | 2023.06.23 |
|---|---|
| tslint.json 구성에 포함할 항목은 무엇입니까? (0) | 2023.06.18 |
| C에서 서명되지 않은 int와 서명된 int의 차이점은 무엇입니까? (0) | 2023.06.18 |
| Angular 2의 JSON 파이프가 작동하지 않습니다. (0) | 2023.06.18 |
| cocoapods 버전 1.0.0.beta.1에 오류가 표시되는 포드 설치 (0) | 2023.06.18 |