在我的表中,我有一些重复的记录,我想取具有最新日期的记录。这是因为我使用了一个游标,游标返回给我重复的记录和我必须插入到表中的信息,但我不能这样做,因为重复的记录。这可能是一个函数错误,因为我使用了其中的4个,idk。我不知道我能做些什么来解决它。对不起我的英语。
这是我尝试使用的程序:
CREATE OR REPLACE PROCEDURE PR_INSERT_DATOS IS
CURSOR CUR_DATOS IS
SELECT DISTINCT NUMRUN AS NUMRUN, PNOMBRE||' '||SNOMBRE||' '||APATERNO||' '||AMATERNO AS NOMBRE
FROM ANTECEDENTES_PERSONALES
ORDER BY NUMRUN;
V_PTJE_ANNOS_EXP NUMBER(8);
V_PTJE_HORAS_TRAB NUMBER(8);
V_PTJE_ZONA NUMBER(8);
V_PTJE_RANKING NUMBER(8);
BEGIN
EXECUTE IMMEDIATE('TRUNCATE TABLE DETALLE_PUNTAJE_POSTULACION');
FOR REG_DATOS IN CUR_DATOS LOOP
V_PTJE_ANNOS_EXP:=FN_PTJ_ANNOS_EXP(REG_DATOS.NUMRUN);
V_PTJE_HORAS_TRAB:=FN_PTJE_HORAS(REG_DATOS.NUMRUN);
V_PTJE_ZONA:=FN_PTJE_ZONA(REG_DATOS.NUMRUN);
V_PTJE_RANKING:=FN_PTJE_RANKING(REG_DATOS.NUMRUN);
INSERT INTO DETALLE_PUNTAJE_POSTULACION VALUES (REG_DATOS.NUMRUN, REG_DATOS.NOMBRE, V_PTJE_ANNOS_EXP,
V_PTJE_HORAS_TRAB, V_PTJE_ZONA, V_PTJE_RANKING, 0, 0);
END LOOP;
END;
字符串
这就是我犯的错误
01422. 00000 - "exact fetch returns more than requested number of rows"
*Cause: The number specified in exact fetch is less than the rows returned.
*Action: Rewrite the query or change number of rows requested
型
3条答案
按热度按时间eyh26e7m1#
您可以使用如下所示的内部查询这样的解决方案
字符串
并使用它与OTHER_COLS AND DATE_COL上的同一个表进行内部联接,以获取要插入到第二个表中的列
ryevplcw2#
你发布的代码不能返回
TOO_MANY_ROWS
,所以我怀疑它(至少)是关于你调用的函数之一。你应该1.仔细检查错误信息;上面到底写了什么?哪个过程/函数引发了该错误,在哪一行?Oracle显示该信息
1.修复它,使其不会引发错误
至于获取属于最后日期的行的方法,有几种方法。
让我们假设您的表看起来像这样(我设置日期格式,以便您知道它代表什么;你不必这样做):
字符串
一种选择是使用一个简单的
max
聚合函数:型
这应该足够你现在所做的了。
但是,如果你想使用第二高的日期值,请注意,你可以使用分析函数,例如
row_number
-按nombre
划分行,按datum
降序排序,并提取排名最高的行(rn = 1
):型
如果你想取第二个最高值,你可以将第8行修改为
rn = 2
另一个可能有用的分析函数是
rank
-如果有更多的行具有相同的datum
值,您将获得所有这些结果。在你的情况下很可能不是这样。oxiaedzo3#
您不需要游标或循环,可以在单个SQL语句中完成:
字符串
您没有说明希望按哪些列分组,也没有说明希望采用最新值的日期列的名称,因此
PARTITION BY
和ORDER BY
子句留给您完成。