背景说明

Oracle中Varray可以嵌套定义,即Varray定义中可以引用已经定义的Varry,例如:
declare
    TYPE VAR_TYP IS VARRAY(20) OF NUMBER;
    TYPE VAR_TYP_2 IS VARRAY(10) OF VAR_TYP;
begin
    return '';
END pkg_subtype;

在PolarDB-O中,支持Varray类型的定义,但是不支持嵌套定义的语法,需要做简单改造。

解决方案

PolarDB-O中Varry的定义方法:
TYPE varraytype IS { VARRAY | VARYING ARRAY }(maxsize)
  OF { datatype | objtype };
说明 OF后的具体类型只支持datatype与objtype,不支持varraytype。

示例

  • 对于嵌套定义的Varry做改造:
    declare
        TYPE VAR_TYP IS VARRAY(20) OF NUMBER;
        TYPE VAR_TYP_2 IS VARRAY(10) OF NUMBER;
    begin
        return '';
    END pkg_subtype;
  • DECLARE
        TYPE dname_varray_typ IS VARRAY(4) OF VARCHAR2(14);
        dname_varray    dname_varray_typ;
        CURSOR dept_cur IS SELECT dname FROM dept ORDER BY dname;
        i               INTEGER := 0;
    BEGIN
        dname_varray := dname_varray_typ(NULL, NULL, NULL, NULL);
        FOR r_dept IN dept_cur LOOP
            i := i + 1;
            dname_varray(i) := r_dept.dname;
        END LOOP;
        DBMS_OUTPUT.PUT_LINE('DNAME');
        DBMS_OUTPUT.PUT_LINE('----------');
        FOR j IN 1..i LOOP
            DBMS_OUTPUT.PUT_LINE(dname_varray(j));
        END LOOP;
    END;