Skip to content

自定义数据类型管理

面向对象编程思想在越来越多的语言中得以实现,如 JAVA、.NET,在这些语言中都允许自定义类,虚谷数据库也可以使用对象。

虚谷数据库提供了内置的数据类型供用户选择使用:如 INT,VARCHAR,DATE;用户还可以自己定义需要的数据类型,即:自定义数据类型,也叫虚谷数据库对象。像其他面向对象语言一样,虚谷数据库对象也包括属性和方法。

使用语法:

sql
CREATE TYPE type_name AS OBJECT(
  a INT,
  b VARCHAR,
  MEMBER FUNCTION c RETURN DATE

例:定义这样一个对象,T_ADDRESS 表示地址,包括四个属性:

sql
CREATE TYPE t_address AS OBJECT(
  street VARCHAR,
  city VARCHAR,
  state VARCHAR,
  country VARCHAR

例:定义这样一个对象,T_PRODUCT 不仅包括属性,还包括一个方法:

sql
CREATE TYPE t_product AS OBJECT (
  id INTEGER,
  name VARCHAR,
  description VARCHAR,
  price NUMBER(6,2),
  days_valid INTEGER,
  MEMBER FUNCTION get_sell_date RETURN DATE

如下图所示:


创建类型体

sql
CREATE TYPE BODY t_product AS
MEMBER FUNCTION get_sell_date RETURN DATE IS
  v_sell_date DATE ;
  BEGIN
    SELECT food_ptime INTO v_sell_date FROM sell_food;
    RETURN v_sell_date ;
  END;
END;

构造函数:像其他对象语言一样,虚谷数据库对象也有构造函数,用来初始化自身的属性默认值。每个类对象都有自己的构造函数,相应的构造函数会在创建类对象时自动创建,也可以自己定义虚谷数据库对象的构造函数,按照使用者的想法对对象属性赋初始值。

例:

sql
CREATE TYPE t_person AS OBJECT(
  p_id INTEGER,
  p_name VARCHAR2(20),
  phone VARCHAR2(12),
  CONSTRUCTOR FUNCTION t_person(p_parameter int) RETURN SELF AS RESULT);

CREATE TYPE BODY t_person AS
CONSTRUCTOR function t_person(p_parameter int) RETURN SELF AS RESULT
  IS
  BEGIN
      (处理部分);
  END ;
END;

根据构造函数 p_parameter 个数和类型的不同,可以定义多个自定义构造函数。虽然构造函数的名字相同,但因参数的个数或类型不同,所以并不发生冲突。这是面向对象编程中“多态”的一种体现。

另外,以上创建的对象类型属性的数据类型都是虚谷数据库内部提供的,也可以将自定义的对象类型作为一种数据类型在创建对象类型时使用。如:

sql
CREATE TYPE t_person1 AS OBJECT(
  name VARCHAR,
  phone VARCHAR,
  address t_address);

此处用的 t_address 就是在上面创建的自定义对象类型 t_address。

对象类型在数据库中的使用:

可以像使用虚谷数据库内置的数据类型一样使用自定义数据库对象类型,在创建表时,可以将其作为列的一个定义,如:使用刚才创建的对象 t_product 创建表 products。

sql
CREATE TABLE products (
  product t_product,
  quantity INTEGER

向表中插入数据:

sql
INSERT INTO products VALUES (t_product (1,'name of goods','description of goods',3.2,10), 20
sql
DECLARE
  a t_product;
BEGIN
  a:=t_product(2,'name of goods','description of goods',3.0,10
  INSERT INTO products VALUES(a,20
END;

SELECT * FROM products p WHERE p.product.id=1 ;