참조 커서를 반환하는 Oracle 저장 프로 시저가 있습니다. 내가 그것을 계산하기 위해 반환하기 전에 커서를 열고 싶은 경우 예외를 throw하지만 구문에 문제가 있고 어떻게 해야하는지 메신저. 당신이 커서를 두 번 열 수오라클, 커서를 열고 하나의 열을 여러 변수로 선택하는 방법
CREATE OR REPLACE PROCEDURE YOUR_PROC(O_CURSOR OUT SYS_REFCURSOR) is
ASN_NO NUMBER; -- have to define all columns the cursor returns
V_CHECK_ASN_NO NUMBER;
-- local function to generate the cursor, to avoid repeating the text
-- or using dynamic SQL
FUNCTION GET_CURSOR RETURN SYS_REFCURSOR IS
V_CURSOR SYS_REFCURSOR;
BEGIN
OPEN V_CURSOR FOR
SELECT *
FROM AN_ORDER_INFO OI, AN_SHIPMENT_INFO SI
-- where bunch of stuff
RETURN V_CURSOR;
END;
BEGIN
-- open the cursor for your check; might be better to have a local
-- variable for this rather than touching the OUT parameter this early
O_CURSOR := GET_CURSOR;
LOOP
FETCH O_CURSOR INTO ASN_NO; -- and all other columns!
EXIT WHEN O_CURSOR%NOTFOUND;
IF V_CHECK_ASN_NO IS NOT NULL AND V_CHECK_ASN_NO != ASN_NO THEN
-- means we have two distinct values
CLOSE O_CURSOR;
RAISE MULTIPLE_ASNS;
END IF;
V_CHECK_ASN_NO := ASN_NO;
END LOOP;
-- close the check version of the cursor
CLOSE O_CURSOR;
-- re-open the cursor for the caller
O_CURSOR := GET_CURSOR;
END YOUR_PROC;
: 당신이 그 위에 카운트 같은 커서 여러 번 열고 싶다면
V_ASN_COUNT NUMBER;
OPEN O_CURSOR FOR
SELECT column1, -- a bunch of columns
column2,
COUNT(DISTINCT SI.ASN_NO) OVER (PARTITION BY SI.ASN_NO) AS ASN_COUNT
FROM AN_ORDER_INFO OI, AN_SHIPMENT_INFO SI
WHERE -- a bunch of criteria
OPEN O_CURSOR;
LOOP
FETCH ASN_COUNT INTO V_ASN_COUNT;
END LOOP;
CLOSE O_CURSOR;
IF(V_ASN_COUNT > 1) THEN
RAISE MULTIPLE_ASNS;
END IF;
'FETCH'는 행을 사용하므로 커서를 반환하기 전에 일부 행을 가져 오는 경우 해당 행을 호출자가 반환 된 커서를 통해 더 이상 사용할 수 없습니다. 그게 받아 들일 수 있니? –
나는 그것을 몰랐다. 호출자는 asn_count를 제외하고이 select 명령문이 필요한 모든 것을 필요로합니다. 이 시나리오에서 오류 처리를 위해 asn_count를 가져 오는 방법은 무엇입니까? – SomeRandomDeveloper
정확히 당신의 요구 사항은 무엇입니까? _ "** ** 'ASN_COUNT> 1'이면 ** 어떤 행도 처리되지 않아 예외가 발생해야합니다 ** ** ** _? 아니면,'ASN_COUNT> 1 '이 발생하면 처리를 시작한 다음 중단하고'ROLLBACK '을 받아 들일 수 있습니까? –