2017-08-08 116 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;