如何在对象内部有一个常量场

How to have a constant field inside a object

测试代码:https://dbfiddle.uk/?rdbms=oracle_21&fiddle=1be9f3d406df287afd874ad5dfc94cfc

我想在一个对象中有一个常量场。我可以用一个包来做到这一点,但我还没有成功地用一个对象来做到这一点。为什么?

create type a as object(
  a  integer
) --OK

create type  as object(
  b constant  integer :=1
)

ORA-02302: invalid or missing type name

CREATE TYPE syntax不允许:

object_type_def ::=

datatype ::=

没有任何地方说您可以使用 CONSTANT keyword


作为替代方案,您可以创建一个属性并将其设置为 user-defined 构造函数中的值:

CREATE TYPE test IS OBJECT(
  a  NUMBER,
  pi NUMBER,
  
  CONSTRUCTOR FUNCTION test(
    SELF IN OUT NOCOPY test,
    a NUMBER
  ) RETURN SELF AS RESULT
);

正文类型:

CREATE TYPE BODY test IS
  CONSTRUCTOR FUNCTION test(
    SELF IN OUT NOCOPY test,
    a NUMBER
  ) RETURN SELF AS RESULT
  IS
  BEGIN
    SELF.a  := a;
    SELF.pi := 3.14159;
    RETURN;
  END;
END;
/

然后:

SELECT test(1).a, test(1).pi
FROM   DUAL;

输出:

TEST(1).A TEST(1).PI
1 3.14159

但是,这不会使该值成为常量,它仍然可以设置为其他值:

DECLARE
  v_obj TEST := TEST(1);
BEGIN
  v_obj.pi := 4; -- For large circles!
  DBMS_OUTPUT.PUT_LINE( v_obj.a || ', ' || v_obj.pi );
END;
/

输出:

1, 4

只要您有永不更改该值的策略,那么它将成为 user-defined 构造函数的默认值;如果有人违反该政策,那么...

db<>fiddle here