全部產品
Search
文件中心

PolarDB:CREATE TYPE BODY

更新時間:Jul 06, 2024

定義新的物件類型主體。

文法

CREATE [ OR REPLACE ] TYPE BODY name
  { IS | AS }
 method_spec [...]
END

其中 method_spec 是:

subprogram_spec

subprogram_spec 是:

  { MEMBER | STATIC }
  { PROCEDURE proc_name
      [ ( [ SELF [ IN | IN OUT ] name ]
          [, argname [ IN | IN OUT | OUT ] argtype
                     [ DEFAULT value ]
          ] ...)
      ]
  { IS | AS }
 program_body
    END;
  |
    FUNCTION func_name
      [ ( [ SELF [ IN | IN OUT ] name ]
          [, argname [ IN | IN OUT | OUT ] argtype
                     [ DEFAULT value ]
          ] ...)
      ]
    RETURN rettype
  { IS |AS }
 program_body
    END;
  }

說明

CREATE TYPE BODY定義新的物件類型主體。CREATE OR REPLACE TYPE BODY將建立新的物件類型主體,或替換現有主體。

如果包括 schema 名稱,則在指定的 schema 中建立物件類型主體。否則在當前 schema 中建立。新物件類型主體的名稱必須與同一 schema 中現有物件類型規格匹配。新物件類型主體的名稱不得與同一 schema 中的任何現有物件類型主體匹配,除非旨在更新現有物件類型主體的定義,在此情況下使用 CREATE OR REPLACE TYPE BODY

參數

參數 說明
name 要建立主體的物件類型的名稱(可能是 schema 限定的)。
MEMBER | STATIC 如果子程式在對象執行個體上運行,請指定 MEMBER。如果子程式的運行獨立於任何特定對象執行個體,請指定 STATIC。
proc_name 要建立的預存程序的名稱。
SELF [ IN | IN OUT ] name 對於成員方法,存在一個名為 SELF 的隱式內建參數,其資料類型就是正在定義的物件類型的資料類型。SELF 引用當前正在調用方法的對象執行個體。SELF 可以在參數列表中顯式聲明為 ININ OUT 參數。如果顯式聲明,則 SELF 必須為參數列表中的第一個參數。如果未明確聲明 SELF,則其參數模式預設為 IN OUT(對於成員預存程序)和 IN(對於成員函數)。
argname 參數的名稱。參數在方法主體中通過該名稱進行引用。
argtype 方法參數的資料類型。參數類型可以是基礎資料型別 (Elementary Data Type)或使用者定義型別,如巢狀表格或物件類型。任何基本類型不得指定長度,例如,可以指定為 VARCHAR2,而不可以指定為 VARCHAR2(10)
DEFAULT value 如果方法調用中未提供預設值,則為輸入參數提供一個預設值。對於模式為 IN OUTOUT 的參數,可能無法指定 DEFAULT
program_body 構成函數或預存程序的主體的 pragma、聲明和 SPL 語句。Pragma 可以為 PRAGMAAUTONOMOUS_TRANSACTION,這會將函數或預存程序設定為自治事務。
func_name 要建立的函數的名稱。
rettype 返回資料類型,可以是為 argtype 列出的任意類型。對於 argtype,不得為 rettype 指定長度。

樣本

CREATETYPE 命令樣本中給出的物件類型 emp_obj_typ 建立物件類型主體。

CREATE OR REPLACE TYPE BODY emp_obj_typ AS
    MEMBER PROCEDURE display_emp (SELF IN OUT emp_obj_typ)
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Employee No   : ' || empno);
        DBMS_OUTPUT.PUT_LINE('Name          : ' || ename);
        DBMS_OUTPUT.PUT_LINE('Street        : ' || addr.street);
        DBMS_OUTPUT.PUT_LINE('City/State/Zip: ' || addr.city || ', ' ||
            addr.state || ' ' || LPAD(addr.zip,5,'0'));
    END;
END;

CREATE TYPE 命令樣本中給出的物件類型 dept_obj_typ 建立物件類型主體。

CREATE OR REPLACE TYPE BODY dept_obj_typ AS
    STATIC FUNCTION get_dname (p_deptno IN NUMBER) RETURN VARCHAR2
    IS
        v_dname     VARCHAR2(14);
    BEGIN
        CASE p_deptno
            WHEN 10 THEN v_dname := 'ACCOUNING';
            WHEN 20 THEN v_dname := 'RESEARCH';
            WHEN 30 THEN v_dname := 'SALES';
            WHEN 40 THEN v_dname := 'OPERATIONS';
            ELSE v_dname := 'UNKNOWN';
        END CASE;
        RETURN v_dname;
    END;
    MEMBER PROCEDURE display_dept
    IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Dept No    : ' || SELF.deptno);
        DBMS_OUTPUT.PUT_LINE('Dept Name  : ' ||
            dept_obj_typ.get_dname(SELF.deptno));
    END;
END;