【问题标题】:ORACLE stored procedure returning too many rowsORACLE 存储过程返回太多行
【发布时间】:2011-12-29 03:57:09
【问题描述】:

我正在尝试在 Oracle 中编写一个存储过程(我开始讨厌它(题外话)) 执行存储过程时,我被告知检索了太多行(例如超过 1 行),但是当通过文本查询数据时,它清楚地告诉我只有一行符合此条件。

创建或替换 程序获取地址评分 ( VARCHAR2 中的房子 , VARCHAR2 中的街道 , X 输出号码 , 你的号码 ) 作为 开始 从 MASTER_ADDRESS 中选择 X_COORD、Y_COORD 到 X、Y 其中 HOUSE=HOUSE 且 STR_NAME=STREET 且 PRE_DIR 为 NULL; 结束GETADDRESSCOORDS;

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

SQL> 执行 getaddresscoords('1550', 'BEDFORD', :X, :Y) BEGIN getaddresscoords('1550', 'BEDFORD', :X, :Y);结尾; * 第 1 行的错误: ORA-01422: 精确提取返回的行数多于请求的行数 ORA-06512:在“TAXLOTS.GETADDRESSCOORDS”,第 9 行 ORA-06512: 在第 1 行

所以我得到了太多的行......但是当我执行这个时:

SQL> SELECT MAX(rownum) from MASTER_ADDRESS where HOUSE='1550' AND STR_NAME='BEDFORD' AND PRE_DIR 为空; 最大(行号) ------------ 1

我在这里错过了什么?

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

    您的问题与变量范围有关。在您的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;
    

    如果您要声明局部变量,您将类似地使用某种命名约定来区分它们与表中的列(即 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;
    

    但这不会很传统。

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2011-01-31
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多