1

두 개의 테이블이 있습니다. 모델 및 자동차. 그리고 사용자가 입력 한 이름과 가격 (AUTOMOBILES에 저장 됨)으로 모든 모델을 내보내는 절차.둘 이상의 엔티티를 출력하는 방법 (oracle sql)

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICE OUT AUTOMOBILES.A_PRICE%TYPE) 
             as 
             begin 
SELECT a.A_PRICE 
INTO VAR_PRICE 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL||'''s price is : '||VAR_PRICE); 
END; 

프로 시저 시작 :

var v_modelzz varchar2; 
exec modelzz('&model_name',:v_modelzz); 

문제는 I가 특정 모델에 대한 모든 개체를 내보낼. 두 개 이상의 모델이 둘 이상의 레코드를 가질 수 있습니다. 나는 그것이 실용적이지 않다는 것을 안다. 그것은 단지 시험입니다. 여기서 오류는 다음과 같습니다 exact fetch returns more than requested number of rows

답변

1
당신은 (내가 테스트하지 않은 코드, 그냥 예) 오라클 유형을 만들어야합니다

:

create type v_price_array 
as table of AUTOMOBILES.A_PRICE%TYPE ; 

변경 절차 반환 유형 :

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICES OUT v_price_array) 

Or return created array type from function instead of procedure. 

그리고 변화를 당신의 선택 :

SELECT a.A_PRICE 
BULK COLLECT INTO VAR_PRICES 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE); 

두 번째 방법은 OUT 매개 변수 sys_refcursor를 반환하는 것입니다. 그런 다음 절차 내에서 커서를 열어야합니다.

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICES OUT SYS_REFCURSOR) 
             as 
             begin 
OPEN VAR_PRICES FOR 
SELECT a.A_PRICE 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE); 
END; 

두 번째 방법을 권장합니다.

+1

@ruveena 편집 해 주셔서 감사합니다. –

+0

솔루션이 작동하는 경우 피드백을 보내주십시오. –

관련 문제