全部产品
云市场

类型构造表达式

更新时间:2020-03-24 09:50:46

类型构造器表达式(Type Constructor Expression)指定了调用构造器方法。类型构造器的参数可以是任意表达式。函数被调用的地方,类型构造器也可以被调用。

语法如下:

  1. [ NEW ] [ schema. ]type_name
  2. ([ expr [, expr ]... ])

NEW 关键字适用于对象类型构造器,但不适用于集合类型构造器。它会引导 OceanBase 通过调用合适的构造器构建一个新的对象。NEW 关键字的使用是可选。

如果 type_name 是对象类型(Object type),则表达式必须是一个有序列表,其中有序列表的第一个参数的值类型与对象类型的第一个属性匹配,第二个参数的值类型与对象类型的第二个属性匹配,以此类推。构造器的参数总数量与对象类型的属性总数量必须匹配。

如果 type_name 是可变长数组(VARRAY)或者嵌套表类型(Nested table type),则表达式列表可以包含 0 个或多个参数。0 参数表示创建一个空集合。否则,每个参数与类型是集合类型中元素的类型的元素值一致。

类型构造器调用的限制

调用类型构造器方法时,尽管对象类型可以拥有超过 999 个属性值,参数的数量不能超过 999。此限制仅适用于从 SQL 中调用构造器。如果是从 PL/SQL 中调用,则需应用 PL/SQL 的限制规则。

示例

以下示例使用了一个预先创建好的类型 cust_address_typ 展示了在调用构造器方法时表达式的使用(示例代码 3~11 行为 PL/SQL 语句):

  1. CREATE TYPE address_book_t AS TABLE OF cust_address_typ;
  2. DECLARE
  3. myaddr cust_address_typ := cust_address_typ(
  4. '500 Oracle Parkway', 94065, 'Redwood Shores', 'CA','USA');
  5. alladdr address_book_t := address_book_t();
  6. BEGIN
  7. INSERT INTO customers VALUES (
  8. 666999, 'Joe', 'Smith', myaddr, NULL, NULL, NULL, NULL,
  9. NULL, NULL, NULL, NULL, NULL, NULL, NULL);
  10. END;

以下示例使用预先创建好的 warehouse_typ 类型展示了在调用构造器方法时子查询的使用:

  1. CREATE TABLE warehouse_tab OF warehouse_typ;
  2. INSERT INTO warehouse_tab
  3. VALUES (warehouse_typ(101, 'new_wh', 201));
  4. CREATE TYPE facility_typ AS OBJECT (
  5. facility_id NUMBER,
  6. warehouse_ref REF warehouse_typ);
  7. CREATE TABLE buildings (b_id NUMBER, building facility_typ);
  8. INSERT INTO buildings VALUES (10, facility_typ(102,
  9. (SELECT REF(w) FROM warehouse_tab w
  10. WHERE warehouse_name = 'new_wh')));
  11. SELECT b.b_id, b.building.facility_id "FAC_ID",
  12. DEREF(b.building.warehouse_ref) "WH"
  13. FROM buildings b;