2015-06-03 2 views
0

Я работаю на преобразование хранимой процедуры SQL в Oracle, и я получаю эту ошибку:Как исправить ошибки ORA-01427

ORA-01427: однорядные подзапрос возвращает более одной строки ORA-06512: на «CMIUSER.PROCEDURE3», строка 21 ORA-06512: по строке 7

t_name_match и t_descript_match являются глобальными временными таблицами.

Может кто-нибудь объяснить мне, что я делаю неправильно?

create or replace PROCEDURE "PROCEDURE3" 
(
    IN_SEARCH_TEXT IN NVARCHAR2 
, OUT_O_RC OUT SYS_REFCURSOR 
) AS 
BEGIN 
/******************************************************************************* *** 
** Name matches 
******************************************************************************** ***/ 
/* 
** Load matches to Name Table 
*/ 
INSERT INTO t_name_match (KBID, SYMBOLID, FEATURENAME) 
SELECT fm.KBID, fm.SYMBOLID, fm.FEATURENAME 
    from FEATURE_MASTER fm 
where Upper(featurename) like IN_SEARCH_TEXT; 
/* 
** Add description for each of these matching names. 
*/ 

UPDATE t_name_match nm 
SET nm.DESCRIPT = (SELECT x.DESCRIPT 
    from CHAR_FEATURE_XRF x 
    where x.KBID = nm.KBID 
    and x.SYMBOLID = nm.SYMBOLID); 

/******************************************************************************* *** 
** Description matches 
******************************************************************************** ***/ 
/* 
** Load matches to Descript table 
*/ 
INSERT INTO t_descript_match (KBID, SYMBOLID, DESCRIPT) 
SELECT x.KBID, x.SYMBOLID, x.DESCRIPT 
    from CHAR_FEATURE_XRF x 
where Upper(descript) like IN_SEARCH_TEXT; 


/* 
** Add name for each of these matching descriptions. 
*/ 

UPDATE t_descript_match dm 
SET dm.FEATURENAME = (SELECT f.FEATURENAME 
    from FEATURE_MASTER  f 
    where f.KBID = dm.KBID 
    and f.SYMBOLID = dm.SYMBOLID); 

/******************************************************************************* *** 
** Return result set 
******************************************************************************** ***/ 
OPEN OUT_O_RC FOR 
SELECT nm.featurename, nm.descript 
    from t_name_match nm 
    UNION 
SELECT dm.featurename, dm.descript 
    from t_descript_match dm 
ORDER BY featurename, descript; 



END PROCEDURE3; 

ответ

3

Единственное место (что я заметил), где у вас есть «Однорядовый подзапрос» является:

UPDATE t_name_match nm 
    SET nm.DESCRIPT = (SELECT x.DESCRIPT 
         from CHAR_FEATURE_XRF x 
         where x.KBID = nm.KBID and x.SYMBOLID = nm.SYMBOLID 
        ); 

Как исправить это зависит от того, что вы хотите сделать. Два простых способа являются MAX() и rownum = 1:

UPDATE t_name_match nm 
    SET nm.DESCRIPT = (SELECT MAX(x.DESCRIPT) 
         from CHAR_FEATURE_XRF x 
         where x.KBID = nm.KBID and x.SYMBOLID = nm.SYMBOLID 
        ); 

UPDATE t_name_match nm 
    SET nm.DESCRIPT = (SELECT x.DESCRIPT 
         from CHAR_FEATURE_XRF x 
         where x.KBID = nm.KBID and x.SYMBOLID = nm.SYMBOLID and 
          rownum = 1 
        ); 

EDIT:

О, я вижу, есть два места. Другая:

UPDATE t_descript_match dm 
    SET dm.FEATURENAME = (SELECT f.FEATURENAME 
          from FEATURE_MASTER f 
          where f.KBID = dm.KBID and f.SYMBOLID = dm.SYMBOLID 
         ); 

Вы бы исправило это так же.

+0

Спасибо, это исправило мою проблему, и я возвращаю правильные результаты. – SimplyZ

1
UPDATE t_name_match nm 
    SET nm.DESCRIPT = (SELECT x.DESCRIPT 
    from CHAR_FEATURE_XRF x 
    where x.KBID = nm.KBID 
    and x.SYMBOLID = nm.SYMBOLID group by x.DESCRIPT); 


    UPDATE t_descript_match dm 
    SET dm.FEATURENAME = (SELECT f.FEATURENAME 
    from FEATURE_MASTER  f 
    where f.KBID = dm.KBID 
    and f.SYMBOLID = dm.SYMBOLID group by f.FEATURENAME); 

вы можете попробовать эти и проверить.

+0

Эй, спасибо за помощь. Этот метод действительно работает, но я выбрал метод Гордона, поскольку я думаю, что он более согласован с тем, что мне нужно. – SimplyZ

+1

Этот метод работает только в том случае, если повторяющиеся строки имеют одинаковые значения. Если имеется несколько значений, это приведет к возникновению ошибки. Как правило: не используйте 'group by' в скалярных подзапросах (подзапросы, которые могут возвращать только одну строку). –

+0

Правильно, для нескольких значений это приведет к ошибке. Но так как ничего не было упомянуто о требовании, я предполагал, что идентичные строки могут вызвать проблему. –

Смежные вопросы