如何修复 ORA-01427

How to fix ORA-01427

我正在将存储过程从 SQL 转换为 Oracle,但出现此错误:

ORA-01427: 单行子查询 returns 多于一行 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;
    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);

你能试试看这些吗

唯一(我注意到)有 "single row subquery" 的地方是:

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
                      );

编辑:

哦,我看到有两个地方。另一个是:

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
                         );

你会用同样的方法修复它。