Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


自定义类型

📄字数 1.7K
👁️阅读量 加载中...

自定义类型中仅有对象类型(OBJECT)可定义成员函数与成员过程等,通过TYPE BODY实现,属于PL/SQL范围。OBJECT表示结构类型,可以包含多个属性(元素)和多种方法(成员函数、成员过程),这些属性和方法构成了结构化的数据单元,语法与参数详细参考自定义数据类型OBJECT

  • 示例: 创建 OBJECT 类型,自定义构造函数
sql
SQL> CREATE OR REPLACE TYPE udt_obj_type AS OBJECT
     (
        street VARCHAR,
        city VARCHAR,
        CONSTRUCTOR PROCEDURE udt_obj_type(street_1 VARCHAR,city_2 VARCHAR)
     );
     /

SQL> CREATE OR REPLACE TYPE BODY udt_obj_type IS CONSTRUCTOR PROCEDURE udt_obj_type(street_1 VARCHAR,city_2 VARCHAR) 
     AS 
        BEGIN
            street:= street_1;
            city:= city_2;
        END;
     END;
     /

SQL> CREATE TABLE tab_udt_test(id INT,name VARCHAR,address UDT_OBJ_TYPE);

SQL> INSERT INTO tab_udt_test VALUES(1,'成都',udt_obj_type('金石路','天府之国'));

SQL> SELECT *FROM tab_udt_test;
+----+------+-------------------+
| ID | NAME |      ADDRESS      |
+----+------+-------------------+
| 1  | 成都 | [金石路,天府之国]  |
+----+------+-------------------+
  • 示例: 创建 OBJECT 对象的静态与成员函数
sql
SQL> CREATE OR REPLACE TYPE udt_obj_type_1 as OBJECT
     (
        id int, 
        STATIC FUNCTION test_int(v1 int, v2 int) RETURN BIGINT,
        MEMBER FUNCTION test_int_2(v3 int, v4 int) RETURN NUMERIC(12,4)
     ); 
     /

-- 静态函数与成员函数实现
SQL> CREATE OR REPLACE TYPE BODY udt_obj_type_1 as
     STATIC FUNCTION test_int(v1 int, v2 int) RETURN BIGINT IS
        BEGIN
            RETURN v1 * v2;
        END;
     MEMBER FUNCTION test_int_2(v3 int, v4 int) RETURN NUMERIC(12,4) IS  
        BEGIN
            RETURN v3 + v4;
        END;
     END;
     /  

-- 执行函数输出结果
SQL> DECLARE
        ret_bigint BIGINT;
        udt_bigint udt_obj_type_1;
     BEGIN
        ret_bigint := udt_bigint.test_int(2,4);
        SEND_MSG(ret_bigint);
     END;
     /
-- 输出结果:
8

SQL> DECLARE
        ret_numeric NUMERIC(38,12);
        udt_numeric udt_obj_type_1;
     BEGIN
        ret_numeric := udt_numeric.test_int_2(200,400);
        SEND_MSG(ret_numeric);
     END;
     /
-- 输出结果:
600
  • 示例: 创建 OBJECT 对象的静态与成员过程
sql
SQL> CREATE OR REPLACE TYPE udt_obj_type_2 as OBJECT
     (
        id int, 
        STATIC PROCEDURE add_numbers(v1 NUMERIC(12,4), v2 NUMERIC(12,5)),
        MEMBER PROCEDURE calculate_factorial(v3 INT)
     ); 
     /

-- 静态函数与成员函数实现
SQL> CREATE OR REPLACE TYPE BODY udt_obj_type_2 as
     STATIC PROCEDURE add_numbers(v1 NUMERIC(12,4), v2 NUMERIC(12,5)) IS
        BEGIN
            SEND_MSG( v1 ||'+' || v2 || '=' || (v1 + v2));
        END;
     MEMBER PROCEDURE calculate_factorial(v3 INT) IS  
        result NUMERIC(38,0) := 1;
        BEGIN
            FOR i IN 1..v3 LOOP
                result := result * i;
            END LOOP;
            SEND_MSG(v3|| '! = ' || result);
        END;
     END;
     /  

-- 执行过程输出结果
SQL> DECLARE
        udt_bigint udt_obj_type_2;
     BEGIN
        udt_bigint.add_numbers(2, 4);
     END;
     /
-- 输出结果:
2+4=6

SQL> DECLARE
        udt_numeric udt_obj_type_2;
     BEGIN
        udt_numeric.calculate_factorial(5);
     END;
     /
-- 输出结果:
5! = 120