ORACLE存储过程返回太多行

val*_*don 3 oracle stored-procedures

我正在尝试在Oracle中编写一个存储过程(我已经讨厌了(除此之外))当执行存储过程时我被告知我已经检索到太多行(例如,超过1),但是当通过文本查询数据,它清楚地告诉我只有一行符合这个标准.

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;

运行时,我收到此错误信息:

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

我在这里想念的是什么?

Jus*_*ave 6

您的问题与变量范围有关.在您的SELECT语句中,HOUSE将始终引用表中的列,而不是同名的参数.

通常,在编写PL/SQL时,您使用某种命名约定来区分参数和局部变量与表中的列,以使其更加明显.在你的情况下,你可能想要类似的东西

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;
Run Code Online (Sandbox Code Playgroud)

如果要声明局部变量,则类似地使用某种命名约定来区分它们与表中的列(即l_local_variable).

您可以显式指定与列名称匹配的变量的范围分辨率,但这往往会变得更加丑陋(并且您必须非常小心,不要错过任何列名称和变量名称匹配的情况,未明确指定范围解析).写作是合法的

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;
Run Code Online (Sandbox Code Playgroud)

但这不是很传统.