«Подзапрос ORA-01427 возвращает более одной строки» без использования подзапроса в процедуре - PullRequest
0 голосов
/ 05 марта 2019

У меня есть процедура, которая выдает ошибку «ORA-01427: однострочный подзапрос возвращает более одной строки».Когда я использую statemt в качестве простого SELECT, я получаю 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;  

Где находится причина ошибки и как ее можно исправить?

Я работаю над WINDOWS 10 в ORACLE 12c Enterprise Edition.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я думаю, вы хотели коррелированное обновление

..
FROM '
 || tbl_name || ' a2 JOIN bbx_slope b
ON SDO_CONTAINS(a2.GEOMETRY, b.POINT) = ''TRUE''
WHERE a2.ID = a1.id --This one
GROUP BY a2.ID
..
0 голосов
/ 05 марта 2019

Прямо сейчас Вы пытаетесь обновить одну строку:

 SET(SLOPE_MEDIAN, SLOPE_75, SLOPE_90)

с вашим выбранным результатом.Если ваш SELECT возвращает 50 строк, эти 50 строк ORACLE пытается поместить в эту строку.Отсутствие в предложении WHERE некоторых условий для столбца идентификатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...