【问题标题】:How to fix ORA-01427如何修复 ORA-01427
【发布时间】:2015-08-17 20:32:34
【问题描述】:

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

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;

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案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);
    

    你能试试这些并检查一下吗?

    【讨论】:

    • 您好,感谢您的帮助。这种方法确实有效,但我选择了 Gordon 的方法,因为我认为它更符合我的需要。
    • 此方法仅适用于重复行具有相同值的情况。如果有多个值,那么这将产生错误。作为一般规则:不要在标量子查询(只能返回一行的子查询)中使用group by
    • 正确,对于多个值,这将产生错误。但由于没有提及要求,我认为相同的行可能会导致问题。
    【解决方案2】:

    你有一个“单行子查询”的唯一地方(我注意到)是:

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

    你可以用同样的方法修复它。

    【讨论】:

    • 谢谢,这解决了我的问题,我得到了正确的结果。
    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多