2013-09-25 2 views
0

오라클 PL/SQL에 저장 프로 시저를 작성하도록 과제가 지정되었습니다. 충족해야 할 3 가지 요구 사항이 있습니다.오라클 저장 프로 시저 '학습'문제

  1. 매개 변수 1 개와 1 개가 있어야합니다.

  2. 필자는 암시 적 커서와 SQL 함수를 사용하여 동일한 유형의 필드 수를 계산해야합니다 (이 경우 유형은 자동차 모델이므로 각 모델의 자동차 수가 몇 개인 지).

  3. 모델의 설명을 표시하려면 다른 암시 적 커서를 사용해야합니다.

솔직히 말해서, 나는 실망합니다. 지금까지 저장된 프로 시저에 대한 내가 가진 :

CREATE OR REPLACE Procedure model_details_sp 
(p_model IN VARCHAR2, 
p_noofcars OUT NUMBER) 
IS 
BEGIN 
SELECT COUNT(Model_Name) INTO p_noofcars 
FROM i_car 
GROUP BY Model_Name; 
END; 

정말 당장은 아무 생각이 없습니다. 어떤 조언이나 지시 사항이 가장 감사 할 것입니다.

감사합니다.

안녕하세요, 모든 의견에 감사드립니다. 최종 요구 사항이 명확하지 않았습니다. 익명 블록을 통해이 프로 시저를 호출하여 사용자가 모델 유형 (& vairalbe)을 입력 할 수 있도록하고 프로 시저에 데이터베이스에있는 모델 유형의 수를 표시합니다.

+0

3 단계를 명확히해야 할 수도 있습니다. "디스플레이"란 무엇을 의미합니까? "DBMS_OUTPUT.put_line"을 찾고 있습니까? 또한 req 3은 "명시 적"커서가 아닙니다. 둘 이상의 행을 반환하고 일반적인 암시 적 커서에 실패하므로 req 3이 "명시 적"커서가 아닌지 확인하십시오. –

+0

답장을 보내 주셔서 감사합니다. 디스플레이에서는 DBMS_Output.Putline을 통해 PL/SQL 블록을 사용하여 proc를 호출합니다. – Splunk

답변

1

이러한 유형의 문제를 처리 할 때는 먼저 캡처하려는 데이터에 대해 생각해보십시오.

PL/SQL에서 암시 적 커서를 처리하려면 1 행이 필요하므로 데이터를 이해해야합니다.

이 경우, 어떤 쿼리에서도 사용하지 않는 변수를 전달하기 때문에 다시 평가하는 것이 좋습니다.

저는 이것을 실행할 수있는 데이터베이스가 없지만이를 해결하고 좀 더 가까이 다가 갈 수 있어야합니다. 나는 익명 블록에 넣어 정말 빨리 쓸 수 있습니다.

@ 데이비드 앨 드리지의 의견을
DECLARE 
    PROCEDURE model_details_sp (p_model IN VARCHAR2, p_noofcars OUT NUMBER) 
    IS 
     p_description VARCHAR2 (200); 
    BEGIN 
     --2 
     SELECT COUNT (model_name) 
      INTO p_noofcars 
      FROM i_car 
     WHERE model_name = p_model; 

     DBMS_OUTPUT.put_line ('No of Cars for model: ' || p_noofcars); 

     --3 
     SELECT model_description 
      INTO p_description 
      FROM i_car --the table should be the car_model table so that only one record is returned 
     WHERE model_name = p_model; 

     DBMS_OUTPUT.put_line ('Model Desc' || p_description); 
    END model_details_sp; 
BEGIN 
    dbms_output.put_line(''); 
END; 

:

이 실행 시도 - 실패해야 결과를 - 당신이 클로스로를 사용하여 여러 행을 선택 cannont, 당신은 데이터 집계되지 아니하는

오류 보고서 :

DECLARE 
    p_num NUMBER; 
BEGIN 
    SELECT LEVEL INTO p_num FROM DUAL CONNECT BY LEVEL <= 10; 
    dbms_output.put(p_num); 
END; 

당신이 볼 수 오류는 이것이다

ORA-01422가 : 정확한 이상의 행 ORA-06512의 요구 된 수보다 수익률을 가져 오기 : - : 수에 지정된 라인 4에서 01422. 00000 *이 원인이 "정확한 이상의 행의 요청 수보다 수익률을 가져 오기" 정확한 가져 오기가 반환 된 행보다 적습니다. * 작업 :

DECLARE 
    PROCEDURE model_details_sp 
     (p_model IN VARCHAR2, 
     p_noofcars OUT NUMBER) 
    IS 
    BEGIN 
     SELECT COUNT(*) 
     INTO p_noofcars 
     FROM i_car 
     WHERE model_name = p_model; 
    END; 

    no_of_cars NUMBER := 0; 
BEGIN 
    model_details_sp(:model_name, no_of_cars); 
    dbms_output.put_line('no of cars for ' || :model_name || ' = ' || no_of_cars); 
END; 

내가의 절차를 만들었습니다 행을 다시 작성 쿼리 또는 변경 수

설명 및 후속 의견에서
+0

고맙습니다. 그것은 나에게 좋은 방향을 조종한다. – Splunk

+0

매우 명확하지 않은지 알려주세요 - 나는 '창조적 인 생각'이 흘러 나오도록 정말 빨리 정리했습니다 :) –

+0

여기서'GROUP BY' 절은 필요 없습니다. INTO는 단일 값만을 저장합니다 마침내. – ajmalmhd04

0

요청이 내가 제공하는 것이 해결책이다 그러나 선언 섹션에서 제거하고 CREATE OR REPLACE를 사용하여이를 실행하여 데이터베이스에 쉽게 추출 할 수 있습니다.

이 예제에서는 익명 블록을 실행할 때 바인드 변수 바꾸기 (: model_name)를 지원하는 IDE를 사용한다고 가정합니다. 예를 들어 TOAD에서 "user"는 model_name에 값을 제공하라는 메시지를 표시합니다.