PL/SQL Oracle Referenz auf die nicht initialisierte composite
CREATE OR REPLACE TYPE gma_trg_eval AS OBJECT (
v_id NUMBER,
v_year NUMBER,
v_max_id NUMBER,
v_min_id NUMBER,
v_max_year NUMBER,
v_min_year NUMBER);
CREATE OR REPLACE TYPE gma_trg_eval_table AS TABLE OF gma_trg_eval;
CREATE OR REPLACE FUNCTION gma_trg_test (v_p NUMBER, v_y NUMBER)
RETURN gma_trg_eval_table PIPELINED
IS
v_r gma_trg_eval;
BEGIN
SELECT MAX (id), MIN (id)
INTO v_r.v_max_id, v_r.v_min_id
FROM gma_trg_time_periods
WHERE year_id = v_y;
SELECT MAX (year_id), MIN (year_id)
INTO v_r.v_max_year, v_r.v_min_year
FROM gma_trg_time_periods;
SELECT year_id, id
INTO v_r.v_year, v_r.v_id
FROM gma_trg_time_periods
WHERE period = v_p AND year_id = v_y;
IF v_r.v_year = v_r.v_min_year AND v_r.v_id = v_r.v_min_id
THEN
gma_msg.exit_with_message ('GMA-02006');
END IF;
DBMS_OUTPUT.put_line ('Min = ' || v_r.v_min_id);
DBMS_OUTPUT.put_line ('Max = ' || v_r.v_max_id);
DBMS_OUTPUT.put_line ('Current year = ' || v_r.v_year);
DBMS_OUTPUT.put_line ('Current period = ' || v_r.v_id);
DBMS_OUTPUT.put_line ('Min year = ' || v_r.v_min_year);
DBMS_OUTPUT.put_line ('Max year = ' || v_r.v_max_year);
IF v_r.v_year >= v_r.v_min_year AND v_r.v_year <= v_r.v_max_year
THEN
IF v_r.v_id = v_r.v_min_id
THEN
v_r.v_year := v_r.v_year - 1;
DBMS_OUTPUT.put_line ('Year changed to:' || ' ' || v_r.v_year);
v_r.v_id := v_r.v_max_id;
PIPE ROW (v_r);
ELSE
v_r.v_id := v_r.v_id - 1;
PIPE ROW (v_r);
END IF;
DBMS_OUTPUT.put_line ('Period changed to:' || ' ' || v_r.v_id);
IF v_r.v_id = v_r.v_min_id AND v_r.v_year = v_r.v_min_year
THEN
DBMS_OUTPUT.put_line ('Button is not active');
PIPE ROW (v_r);
END IF;
PIPE ROW (v_r);
END IF;
RETURN;
END;
Wenn ich diese Funktion ausführen,
select * from table(gma_trg_test(2, 2013));
Bekomme ich die folgende Fehlermeldung.
line 64: ORA-06530: Reference to uninitialized composite
ORA-06512: at "GAMMA_OWNER.GMA_TRG_TEST", line 12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Nachricht sagt, Sie haben einen initialisierten composite (Objekt, in diesem Fall). Ihre
v_r
variable ist im Grunde ein Verweis auf ein Objekt. Sie brauchen, um das Objekt selbst, bevor Sie können sich auf die Felder:SQL Fiddle.
Den
null
Werte sind notwendig, denn Sie sind dem Aufruf der default-Konstruktor können Sie mit anderen Werten, aber natürlichnull
sieht hier angebracht. Man könnte vielleicht vereinfacht das ein wenig, indem Sie Ihre eigenen Konstruktor ohne Argumente, aber es macht nur die Instanziierung look ein wenig aufgeräumter, und das ist ein Sache von Meinung sowieso.NEW
Stichwort, ich war sicher, dass es ein Fehler ist... aber wie ich sehe hier, es ist optional.