如何在对象内部有一个常量场
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
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
测试代码: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
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