2017-08-08 147 views
1

我試圖用地圖關聯數組表,但我不能想出如何初始化如何初始化PLSQL矩陣

這裏有一個例子:

TYPE RecType IS RECORD 
(
    value1 NUMBER, 
    value2 NUMBER, 
    value3 NUMBER 
); 
TYPE TblType IS TABLE OF RecType INDEX BY PLS_INTEGER; 
TYPE TblOfTblType IS TABLE OF TblType INDEX BY PLS_INTEGER; 
matrix TblOfTblType; 

現在當我試圖初始化像這樣的矩陣:

FOR i IN matrix.FIRST .. matrix.LAST LOOP 
    FOR j IN matrix (i).FIRST .. matrix (i).LAST LOOP 
     matrix(i)(j) := NULL; 
    END LOOP; 
END LOOP; 

它不工作,我也試過

matrix := TblOfTblType()(); 

它顯示以下錯誤:

PLS-00363表達式「矩陣」不能被用作分配對象。

+0

感謝您的回覆,可以請你幫我,我怎麼可以創建一個矩陣plsql,我的過程應該如何? – maryam

回答

4

您不需要使用關聯數組 - 集合將起作用。

DECLARE 
    TYPE RecType IS RECORD 
    (
    value1 NUMBER, 
    value2 NUMBER, 
    value3 NUMBER 
); 
    TYPE TblType IS TABLE OF RecType; 
    TYPE TblOfTblType IS TABLE OF TblType; 
    matrix TblOfTblType := TblOfTblType(); 
BEGIN 
    matrix.EXTEND(3); 
    FOR i IN 1 .. matrix.COUNT LOOP 
    matrix(i) := TblType(); 
    matrix(i).EXTEND(4); 
    FOR j IN 1 .. matrix(i).COUNT LOOP 
     matrix(i)(j).value1 := i; 
     matrix(i)(j).value2 := j; 
     matrix(i)(j).value3 := DBMS_RANDOM.VALUE; 
    END LOOP; 
    END LOOP; 

    FOR i IN 1 .. matrix.COUNT LOOP 
    FOR j IN 1 .. matrix(i).COUNT LOOP 
     DBMS_OUTPUT.PUT('[' || matrix(i)(j).value1 
        || ',' || matrix(i)(j).value2 
        || ',' || matrix(i)(j).value3 || ']' || CHR(11)); 
    END LOOP; 
    DBMS_OUTPUT.NEW_LINE; 
    END LOOP; 
END; 
/
+0

您可以打印矩陣嗎? – XING

+3

@XING OP只是詢問初始化矩陣。但是,在另一組循環中使用'DBMS_OUTPUT.PUT(matrix(i)(j).value1)'或'DBMS_OUTPUT.PUT_LINE(matrix(i)(j).value3)'是一件簡單的事情。 – MT0

+0

你可以請嘗試,因爲在問我的問題之前,我試過這個:對於1..matrix.count中的rec 循環 對於 dbms_output.put_line(matrix(rec).value); end loop; – XING

3

雖然我與@ MTO的做法一致,從你的循環方法的錯誤是因爲你試圖指FIRSTLAST在空表上,他們都評價爲null,在這一點上。你實際上要做的:

FOR i IN null .. null LOOP 

它得到相同ORA-06502: PL/SQL: numeric or value error你原來FOR循環。

您尚未定義矩陣的任何尺寸應該是什麼。你需要在某個地方做到這一點,以便能夠「初始化」它,例如與固定值相匹配MTO的和您的類型聲明:

DECLARE 
    TYPE RecType IS RECORD 
    (
    value1 NUMBER, 
    value2 NUMBER, 
    value3 NUMBER 
); 
    TYPE TblType IS TABLE OF RecType INDEX BY PLS_INTEGER; 
    TYPE TblOfTblType IS TABLE OF TblType INDEX BY PLS_INTEGER; 
    matrix TblOfTblType; 
BEGIN 
    FOR i IN 1 .. 3 LOOP 
    FOR j IN 1 .. 4 LOOP 
     matrix(i)(j) := null; 
    END LOOP; 
    END LOOP; 
END; 
/

PL/SQL procedure successfully completed. 

要使用非空值填充你woudl需要你填寫,然後分配TOT他方陣位置單獨記錄變量:

FOR i IN 1 .. 3 LOOP 
    FOR j IN 1 .. 4 LOOP 
     rec.value1 := i; 
     rec.value2 := j; 
     rec.value3 := DBMS_RANDOM.VALUE; 
     matrix(i)(j) := rec; 
    END LOOP; 
    END LOOP; 

或者如果你在其他地方獲得這些表單,你可以在沒有循環的情況下鎖定特定的矩陣元素。你可以把它打印出來以同樣的方式MTO表現太,或FIRSTLAST,它現在是有效的:

FOR i IN matrix.FIRST .. matrix.LAST LOOP 
    FOR j IN matrix(i).FIRST .. matrix(i).LAST LOOP 
     DBMS_OUTPUT.PUT('[' || matrix(i)(j).value1 
        || ',' || matrix(i)(j).value2 
        || ',' || matrix(i)(j).value3 || ']' || CHR(11)); 
    END LOOP; 
    DBMS_OUTPUT.NEW_LINE; 
    END LOOP; 
+2

如果你在關聯數組中使用'FIRST'和'LAST',那麼假設一個稀疏數組並使用'i:= matrix.FIRST;當我不是循環的空循環內容'i:= matrix.NEXT(i); END LOOP;'而不是使用'FOR'循環。 – MT0

+1

是的,我假設它已經被初始化爲OP的意圖,所以它非常密集。如果一個元素可以添加到原始3x4範圍之外,那麼需要更強大的功能。您添加到答案中的輸出循環也適用,但如果可能稀疏,則需要檢查每個點上是否存在某個東西。 –

1
CREATE OR REPLACE TYPE RecType AS OBJECT (
    value1 NUMBER, 
    value2 NUMBER, 
    value3 NUMBER 
); 
/ 

CREATE OR REPLACE TYPE TblType IS TABLE OF RecType; 
/

CREATE OR REPLACE TYPE TblOfTblType IS TABLE OF TblType; 
/

DECLARE 
    matrix TblOfTblType; 
     rec1 RecType; 
     rec2 TblType; 
BEGIN 
    rec1 := RecType(1,2,3); 
    rec2 := TblType(rec1); 
    matrix := TblOfTblType(rec2); 
    dbms_output.put_line(matrix(1)(1).value2); 
END;