2016-03-29 53 views
0

我正嘗試在使用sql開發人員的pl/sql中創建一個對象。我只是基本上搞砸了它。我不斷收到一個錯誤使用plsql中的對象varray

非法引用變量 '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; 

我怎樣才能得到這個工作?

+0

cou試着做什麼?你除了什麼? – Recoil

+0

您使用的是哪種版本的Oracle DB? – Recoil

+0

我不想實現如何在plsql中使用varray和訪問對象,我想我正在使用oracle 10g,儘管我很確定。無論哪種方式您的解決方案爲我工作,非常感謝。 –

回答

1
  1. 嘗試使用數據類型VARCHAR2而不是VARCHAR 請參見:What is the difference between varchar and varchar2?

  2. FOR..LOOP 隱含迭代變量我,在這種情況下,只包含您的收藏當前索引。其實這一點,你應該使用這個變量作爲你的收藏索引。

請考慮以下的方法:

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; 
/

輸出:

d 
1

如圖所示完全可以有VARRAY的另一種選擇。 TABLE類型也可以在這裏使用。所有聚合類型之間的區別在https://community.oracle.com/thread/457834?start=0&tstart=0

解釋希望這會有所幫助。

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;