create table characters_of_force (
name varchar2(128) not null primary key,
alignment varchar2(10) not null,
constraint characters_of_force_chk
check (alignment in ('dark','light','neutral'))
)
Table created.
insert into characters_of_force
values ('Darth Vader', 'dark')
1 row(s) inserted.
insert into characters_of_force
values ('Luke Skywalker', 'light')
1 row(s) inserted.
insert into characters_of_force
values ('Aurra Sing', 'neutral')
1 row(s) inserted.
select * from characters_of_force
NAME | ALIGNMENT | Darth Vader | dark | Luke Skywalker | light | Aurra Sing | neutral |
---|
create or replace package alignment_types as
/* the constant keyword prevents the package variable
from being overridden at a later time */
dark constant varchar2(10) := 'dark';
light constant varchar2(10) := 'light';
neutral constant varchar2(10) := 'neutral';
end;
Package created.
begin
dbms_output.put_line(
'Anakin was first aligned to '
|| alignment_types.light
|| ' but turned to '
|| alignment_types.dark
|| ' later');
end;
Statement processed.
Anakin was first aligned to light but turned to dark later
select alignment_types.light from dual
ORA-06553: PLS-221: 'LIGHT' is not a procedure or is undefinedMore Details: https://docs.oracle.com/error-help/db/ora-06553
create or replace package alignment_types as
/* No public constants anymore,
but functions without parameters */
function light return varchar2;
function dark return varchar2;
function neutral return varchar2;
end;
Package created.
create or replace package body alignment_types as
/* Here we have our constants again,
hiding them from public access */
g_dark constant varchar2(10) := 'dark';
g_light constant varchar2(10) := 'light';
g_neutral constant varchar2(10) := 'neutral';
/* The functions are our only publicly available item */
function light return varchar2
as
begin
return g_light;
end;
function dark return varchar2
as
begin
return g_dark;
end;
function neutral return varchar2
as
begin
return g_neutral;
end;
end;
Package Body created.
select alignment_types.light from dual
LIGHT | light |
---|
alter table characters_of_force
drop constraint characters_of_force_chk
Table altered.
alter table characters_of_force
add constraint characters_of_force_chk
check ( alignment in
(alignment_types.light,
alignment_types.dark,
alignment_types.neutral)
)
ORA-00904: "ALIGNMENT_TYPES"."NEUTRAL": invalid identifierMore Details: https://docs.oracle.com/error-help/db/ora-00904
create or replace package alignment_types as
function light return varchar2;
function dark return varchar2;
function neutral return varchar2;
/* We need a deterministic check-function */
function valid_type(i_value in varchar2)
return int deterministic;
end;
Package created.
create or replace package body alignment_types as
g_dark constant varchar2(10) := 'dark';
g_light constant varchar2(10) := 'light';
g_neutral constant varchar2(10) := 'neutral';
function light return varchar2
as
begin
return g_light;
end;
function dark return varchar2
as
begin
return g_dark;
end;
function neutral return varchar2
as
begin
return g_neutral;
end;
/* This function can just check against our constants */
function valid_type(i_value in varchar2)
return int deterministic
as
begin
if ( i_value in (light, dark, neutral)) then
return 1;
else
return 0;
end if;
end;
end;
Package Body created.
alter table characters_of_force
add (alignment_check number generated always as (
alignment_types.valid_type(alignment)
))
Table altered.
alter table characters_of_force
add constraint characters_of_force_chk
check ( alignment_check = 1 )
Table altered.
insert into characters_of_force ( name, alignment )
values ('Anakin Skywalker', 'confused')
ORA-02290: check constraint (SQL_GPAUFOJMGEKPHOGQUQLARUWDB.CHARACTERS_OF_FORCE_CHK) violated ORA-06512: at "SYS.DBMS_SQL", line 1721More Details: https://docs.oracle.com/error-help/db/ora-02290