2016-03-29 15 views
0

Ich versuche, ein Objekt in pl/SQL mit SQL-Entwickler erstellen. Ich bin nur mit den Grundlagen herumspielen, um einen Hang davon zu bekommen. Ich erhalte einen FehlerVerwenden von Objekten in Plsql-Varray

Ungültige Referenz Variable 'I'

SET serveroutput ON 


create or replace type conditions as object 
(var_name varcher (100) , 
extract_method varchar(100), 
default_value varchar (100), 
idList varchar (100)); 


    DECLARE 
condition conditions; 
TYPE namesarray IS VARRAY(1) OF conditions; 
names namesarray := namesarray();--figure out why this is. 
BEGIN 
condition := conditions('a', 'b', 'c', 'd'); 
names.extend; 
    names(names.last):= condition; 
FOR i IN names.FIRST .. names.LAST 
    LOOP 
    DBMS_OUTPUT.PUT_line(i.idList); 
    END LOOP; 
end; 

wie kann ich dies funktioniert?

+0

Was haben Sie erreicht? Was hast du außer? – Recoil

+0

Welche Version von Oracle DB verwenden Sie? – Recoil

+0

Ich versuche nicht zu sehen, wie man varray verwenden und Objekte in plsql zugreifen, ich denke, ich benutze Oracle 10g, obwohl ich mir sicher bin. So oder so hat Ihre Lösung für mich funktioniert, vielen Dank. –

Antwort

1
  1. Versuchen Sie, den Datentyp VARCHAR2 anstelle von VARCHAR verwenden Siehe: What is the difference between varchar and varchar2?

  2. FOR..LOOP Die implizite Iterationsvariable I, und in diesem Fall enthält nur den aktuellen Index Ihrer Sammlung. In der Tat sollten Sie diese Variable als Index Ihrer Sammlung verwenden.

Bitte folgende Vorgehensweise beachten:

SET serveroutput ON; 

--Use VARCHAR2 instead of VARCHAR 
CREATE OR REPLACE type conditions 
AS object 
    (
    var_name varchar2(100), 
    extract_method VARCHAR2(100), 
    default_value VARCHAR2(100), 
    idList   VARCHAR2(100) 
) ; 
/


DECLARE 
    condition conditions; 
    TYPE namesarray IS VARRAY(1) OF conditions; 
    names namesarray := namesarray() ;--figure out why this is. 
BEGIN 
    condition := conditions('a', 'b', 'c', 'd') ; 
    names.extend; 
    names(names.last) := condition; 
    FOR i IN names.FIRST .. names.LAST 
    LOOP 
    DBMS_OUTPUT.PUT_line(names(i) .idList); -- use I as the index for your collection 
    END LOOP; 
END; 
/

Ausgang:

d 
1

Wie perfekt illustriert es kann eine weitere Alternative von VARRAY sein. TABLE Type kann auch hier verwendet werden. Der Unterschied zwischen allen Arten der Farbauswahl wird erklärt unter https://community.oracle.com/thread/457834?start=0&tstart=0

Hope dies hilft.

SET serveroutput ON; 
DECLARE 
TYPE namesarray 
IS 
    TABLE OF conditions; 
    names namesarray := namesarray() ;--NULL Constructor 
BEGIN 
    names:=namesarray(conditions('a', 'b', 'c', 'd')); 
    FOR i IN names.FIRST .. names.LAST 
    LOOP 
    DBMS_OUTPUT.PUT_line(names(i).idList); -- use I as the index for your collection 
    END LOOP; 
END;