2011-11-15 2 views
2

오라클에 저장 프로 시저를 쓰려고합니다. (요점을 싫어합니다.) 저장된 proc을 실행할 때 너무 많은 행 (예 : 1보다 큼)이지만 텍스트를 통해 데이터를 쿼리 할 때 하나의 행만이 기준과 일치한다는 것을 분명히 알 수 있습니다. 실행하면ORACLE 저장 프로 시저가 너무 많은 행을 반환합니다.

 
create or replace 
PROCEDURE GETADDRESSCOORDS 
(
    HOUSE IN VARCHAR2 
, STREET IN VARCHAR2 
, X OUT NUMBER 
, Y OUT NUMBER 
) AS 
BEGIN 
SELECT X_COORD, Y_COORD INTO X,Y FROM MASTER_ADDRESS 
WHERE HOUSE=HOUSE AND STR_NAME=STREET AND PRE_DIR IS NULL; 
END GETADDRESSCOORDS; 

, 나는이 오류 MSG가 나타납니다

 
SQL> execute getaddresscoords('1550', 'BEDFORD', :X, :Y) 
BEGIN getaddresscoords('1550', 'BEDFORD', :X, :Y); END; 

* 
ERROR at line 1: 
ORA-01422: exact fetch returns more than requested number of rows 
ORA-06512: at "TAXLOTS.GETADDRESSCOORDS", line 9 
ORA-06512: at line 1 

그래서 내가 너무 많은 행을 얻었다을 ...하지만이 실행할 때 :

 
SQL> SELECT MAX(rownum) from MASTER_ADDRESS where HOUSE='1550' 
AND STR_NAME='BEDFORD' AND PRE_DIR IS NULL; 

MAX(ROWNUM) 
----------- 
      1 

을 무엇을 나는 여기에 놓치고 ?

답변

6

문제점은 변수 범위와 관련이 있습니다. SELECT 문에서 HOUSE은 항상 같은 이름의 매개 변수가 아니라 테이블의 열을 나타냅니다.

일반적으로 PL/SQL을 작성할 때 매개 변수와 로컬 변수를 테이블의 열과 구분하기 위해 일종의 명명 규칙을 사용합니다. 귀하의 경우에는, 당신은 아마 당신이 로컬 변수를 선언한다면, 당신은 유사하게 테이블의 열 (즉 l_local_variable)과 구분하기 위해 명명 규칙의 일종을 사용

create or replace 
PROCEDURE GETADDRESSCOORDS 
(
    P_HOUSE IN VARCHAR2 
, P_STREET IN VARCHAR2 
, P_X OUT NUMBER 
, P_Y OUT NUMBER 
) AS 
BEGIN 
    SELECT X_COORD, Y_COORD 
    INTO P_X,P_Y 
    FROM MASTER_ADDRESS 
    WHERE HOUSE=P_HOUSE 
    AND STR_NAME=P_STREET 
    AND PRE_DIR IS NULL; 
END GETADDRESSCOORDS; 

같은 것을 원한다.

열의 이름과 일치하는 변수에 대한 범위 분석을 명시 적으로 지정할 수는 있지만 훨씬 어색한 경향이 있습니다 (열 이름과 열 이름이 다른 경우를 놓치지 않도록주의해야합니다. 변수 이름이 일치하고 범위 분석이 명시 적으로 지정되지 않은 경우). 쓰기가 합법적 일 것입니다.

create or replace 
PROCEDURE GETADDRESSCOORDS 
(
    HOUSE IN VARCHAR2 
, STREET IN VARCHAR2 
, X OUT NUMBER 
, Y OUT NUMBER 
) AS 
BEGIN 
    SELECT X_COORD, Y_COORD 
    INTO X,Y 
    FROM MASTER_ADDRESS ma 
    WHERE ma.HOUSE=getAddressCoords.HOUSE 
    AND ma.STR_NAME=getAddressCoords.STREET 
    AND ma.PRE_DIR IS NULL; 
END GETADDRESSCOORDS; 

그러나 이는 그리 일반적이지 않습니다.

관련 문제