首页 > 解决方案 > “ORA-01427 单行子查询返回多于一行”,过程中没有子查询

问题描述

我有一个抛出错误“ORA-01427:单行子查询返回多于一行”的过程。当我将 statemt 用作简单的 SELECT 时,每个 ID 得到 1 行。
我研究了 ORA-01427,但是我无法真正将答案应用于我的错误,因为据我所知,我没有子查询。

CREATE OR REPLACE PROCEDURE CALC_SLOPE (TBL_NAME IN VARCHAR2) AS 
BEGIN

  EXECUTE IMMEDIATE 'ALTER TABLE '||TBL_NAME||' ADD (SLOPE_MEDIAN NUMBER(2,2),
                                                     SLOPE_75 NUMBER(2,2),
                                                     SLOPE_90 NUMBER(2,2))';

  EXECUTE IMMEDIATE 'UPDATE '||TBL_NAME||' a1 SET(SLOPE_MEDIAN, SLOPE_75, SLOPE_90)
  =(
    SELECT ROUND(MEDIAN(b.SLOPE),2) AS SLOPE_MEDIAN, 
    ROUND(PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY b.slope DESC),2) AS SLOPE_75,
    ROUND(PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY b.slope DESC),2) AS SLOPE_90
    FROM '||TBL_NAME||' a2,
    bbx_slope b
    WHERE SDO_CONTAINS(a2.GEOMETRY, b.POINT) = ''TRUE''
    GROUP BY a2.ID
    )';

END CALC_SLOPE;  

错误的原因在哪里,如何解决?

我正在使用 ORACLE 12c 企业版上的 WINDOWS 10。

标签: oracleplsql

解决方案


现在你试图更新单行:

 SET(SLOPE_MEDIAN, SLOPE_75, SLOPE_90)

与您的选择结果。如果您的 SELECT 返回 50 行,则这 50 行 ORACLE 会尝试放入这一行。您在 WHERE 子句中缺少 ID 列的一些条件


推荐阅读