创建或替换全局子类型

时间:2015-07-14 07:59:49

标签: oracle plsql subtype

我知道我可以在包规范中创建一个子类型,如:

CREATE OR REPLACE PACKAGE XY
AS
  SUBTYPE type_sdebug IS VARCHAR (200);
  ...
END;
/

如果我想在另一个包中使用相同的子类型,那么我需要再次重新定义相同的类型。有没有办法创建或替换全局子类型,如:

CREATE OR REPLACE TYPE STRING_ARRAY AS VARRAY(500) OF VARCHAR2(30);
/

2 个答案:

答案 0 :(得分:4)

据我所知,SUBTYPE是一个PL / SQL功能,因此您无法全局创建它们。但是没有什么可以阻止您在另一个包中使用您的包XY中定义的类型(例如AB):

CREATE OR REPLACE PACKAGE XY
AS
  SUBTYPE type_sdebug IS VARCHAR (200);
END;

CREATE OR REPLACE PACKAGE AB
AS
  PROCEDURE print_it(p_Debug in XY.type_sdebug);
END;

CREATE OR REPLACE PACKAGE BODY AB
AS
  PROCEDURE print_it(p_Debug in XY.type_sdebug) is
  begin
      dbms_output.put_line(p_Debug);
  end;
END;


declare
  v_Debug XY.type_sdebug default 'hello world';
begin
  ab.print_it(v_Debug);
end;

答案 1 :(得分:1)

现在我已经正确地阅读了这个问题* {;-),根据the documentation你确实可以创建一个子类型:

“此语句显示样本oe架构中的子类型corporate_customer_typ是如何创建的。它基于前面示例中创建的customer_typ超类型,并添加了account_mgr_id属性。为表格提供了一个假设的名称,以便您可以在测试数据库中复制此示例:“

CREATE TYPE corporate_customer_typ_demo UNDER customer_typ
    ( account_mgr_id     NUMBER(6)
    );

根据prerequisites for creating types

,您可能需要其他权限才能执行此操作

“要创建子类型,您必须具有UNDER ANY TYPE系统特权或超类型的UNDER对象特权。”