如何修复 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
);
你会用同样的方法修复它。
我正在将存储过程从 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
);
你会用同样的方法修复它。