自定义类型
📄字数 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