2011-11-15 9 views
2

Oracleにストアドプロシージャを書き込もうとしています(ポイントの横に嫌われています) ストアドプロシージャを実行すると、 (例えば1以上の)行を含むが、テキストを介してデータを照会するときに、この基準に一致する行が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; 

これはあまり一般的ではありません。

関連する問題