我正在编写一个 PL/SQL 函数来检查日期并返回一个日期。问题是测试隔离的函数我得到了关于光标使用的错误。 ORA-01001: cursor no válido or in English, 无效的游标。
我使用两个数组来保存不同类型的日期。但是错误出现在FOR ... LOOP
循环中。先验很好地定义了游标和行变量。而且我已经检查并且行变量包含行,查询返回至少 5 行。这里是函数的代码:
create or replace FUNCTION OBTAIN_DATE_FIN_ABSENT
(combination IN VARCHAR2 DEFAULT '',
otarif1 IN VARCHAR2 DEFAULT '',
otarif2 IN VARCHAR2 DEFAULT '',
indicador IN NUMBER DEFAULT 0)
RETURN DATE
AS
i NUMBER := 1;
solution DATE := '01/01/1970';
previousOTARi VARCHAR2(3 CHAR) := '';
TYPE varray_type IS VARRAY(50) OF DATE; -- Création deux arrays des dates.
v1 varray_type; -- array date_begin
v2 varray_type; -- array date_end
-- Requete pour obtenir tous les lignes pour la combinaison passé.
cursor cursorDate is
select cin.cin_value cin_combi, cin.date_begin date_begin, cin.date_end date_end, gin.code gcode, gin.otari_file otari_file
from rs2qtcin cin, rs2qtgin gin
where cin.group_id = gin.id
and cin.cin_value = combination
and substr(gin.otari_file, 1, 1) = substr(otarif1, 1, 1)
order by cin.date_begin, gin.otari_file;
my_cursorDate cursorDate%rowtype;
BEGIN
--open cursorDate;
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Dentro!');
FETCH cursorDate INTO my_cursorDate;
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Dentro1!');
IF cursorDate%FOUND THEN -- El cursor contiene info, sino %NOTFOUND
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Dentro2!');
IF cursorDate%ROWCOUNT != 0 THEN
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- cursor NO vacío!');
ELSE
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- cursor VACÍO!!!');
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Cursor NOTFOUND!');
END IF;
FOR my_cursorDate IN cursorDate LOOP
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Dentro3!');
--v1(i) := my_cursorDate.date_begin;
--v2(i) := my_cursorDate.date_end;
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Guardadas ambas fechas en array!.');
IF v2(i-1) = NULL THEN
--solution := v1(i); -- Guardamos date_begin de la siguiente iteración
IF indicador = 1 and previousOTARi = otarif1 THEN
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- OK!');
ELSE
IF indicador = 2 and previousOTARi = otarif2 THEN
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- ¡CHECK! this case.');
END IF;
END IF;
END IF;
--solution := 1;
previousOTARi := my_cursorDate.otari_file;
i := i+1;
END LOOP;
--close cursorDate;
RETURN solution;
EXCEPTION WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
Open 和 close 游标语句被注释,因为我正在调试代码。但是,当它们未注释时,错误是相同的。