Oracle データベース 23cでは、他の組み込み型と同様に使用できる新しい SQLブール (ブール) データ型が導入されています。実際、PL/SQL は何年も前からブール データ型のサポートを提供しています。
ブールフィールド
ブール データ型は、キーワード BOOLEAN または BOOL を使用して指定します。次に例を示します。
drop table if exists boolean_test purge;
create table boolean_test (
id number generated always as identity,
active boolean,
archived bool
);
このうち、テーブルが存在する場合はドロップする機能もこのバージョンの新機能です。
ブール データに値を割り当てる方法は数多くありますが、次のステートメントでは、アクティブ フラグを true に設定し、アーカイブ済みフラグを false に設定できます。
insert into boolean_test (active, archived) values (true, false);
insert into boolean_test (active, archived) values (TRUE, FALSE);
insert into boolean_test (active, archived) values ('true', 'false');
insert into boolean_test (active, archived) values ('TRUE', 'FALSE');
insert into boolean_test (active, archived) values ('yes', 'no');
insert into boolean_test (active, archived) values ('YES', 'NO');
insert into boolean_test (active, archived) values ('on', 'off');
insert into boolean_test (active, archived) values ('ON', 'OFF');
insert into boolean_test (active, archived) values (1, 0);
insert into boolean_test (active, archived) values ('1', '0');
insert into boolean_test (active, archived) values ('t', 'f');
insert into boolean_test (active, archived) values ('T', 'F');
insert into boolean_test (active, archived) values ('y', 'n');
insert into boolean_test (active, archived) values ('Y', 'N');
commit;
データをクエリします。
select * from boolean_test;
ID ACTIVE ARCHIVED
---------- ----------- -----------
1 TRUE FALSE
2 TRUE FALSE
3 TRUE FALSE
4 TRUE FALSE
5 TRUE FALSE
6 TRUE FALSE
7 TRUE FALSE
8 TRUE FALSE
9 TRUE FALSE
10 TRUE FALSE
11 TRUE FALSE
12 TRUE FALSE
13 TRUE FALSE
14 TRUE FALSE
14 rows selected.
SQL*Plus の古いバージョン、および SQLcl 23.1 までのバージョンでは、true は 1、false は 0 として表示されます。使用するドライバーが true/false をサポートしていないためです。それ以降のバージョンでは正常に表示されます。
ブール型のフィールドは、NOT NULL 制約が定義されていない限り、NULL 値もサポートします。
insert into boolean_test (active, archived) values (null, null);
commit;
select *
from boolean_test
where active is null;
ID ACTIVE ARCHIVED
---------- ----------- -----------
15
delete from boolean_test
where active is null;
commit;
ブール型フィールドは、NOT NULL 制約および CHECK 制約としてだけでなく、UNIQUE、PRIMARY KEY、または FOREIGN KEY 制約の一部としても定義できます。
SQLのサポート
ブール式は他の式と同様に使用できます。ここではいくつかの例を示します。
select count(*)
from boolean_test
where active;
COUNT(*)
----------
14
select count(*)
from boolean_test
where active is true;
COUNT(*)
----------
14
select count(*)
from boolean_test
where active and not archived;
COUNT(*)
----------
14
select count(*)
from boolean_test
where active or archived;
COUNT(*)
----------
14
select count(*)
from boolean_test
where active is null;
COUNT(*)
----------
0
select count(*)
from boolean_test
where active > archived;
COUNT(*)
----------
14
新しいバージョンでは、数値または文字をブール値に変換できるTO_BOOLEAN関数も追加されています。同時に、ブール型をサポートする TO_NUMBER、TO_CHAR、TO_NCHAR 関数がオーバーロードされます。
select to_boolean('true'),
to_boolean('false'),
to_number(active),
to_number(archived),
to_char(active),
to_char(archived),
to_nchar(active),
to_nchar(archived)
from boolean_test
where id = 1;
TO_BOOLEAN( TO_BOOLEAN( TO_NUMBER(ACTIVE) TO_NUMBER(ARCHIVED) TO_CH TO_CH TO_NC TO_NC
----------- ----------- ----------------- ------------------- ----- ----- ----- -----
TRUE FALSE 1 0 TRUE FALSE TRUE FALSE
PL/SQLのサポート
PL/SQL は長い間ブール型をサポートしてきましたが、新しいバージョンではブール データの永続性をサポートできるようになりました。
declare
l_active boolean := true;
l_archived boolean := false;
begin
insert into boolean_test (active, archived)
values (l_active, l_archived);
commit;
end;
/
PL/SQL procedure successfully completed.
前述の TO_BOOLEAN 関数は PL/SQL でも使用できます。
declare
l_true boolean;
l_false boolean;
begin
-- Work
l_true := to_boolean('true');
l_false := to_boolean('false');
end;
/
他のオーバーロードされた変換関数はデフォルトではPL/SQLで使用できませんが、初期化パラメータ PLSQL_IMPLICIT_CONVERSION_BOOL はシステムまたはセッション・レベルで true に設定する必要があります。
alter session set plsql_implicit_conversion_bool=true;
declare
l_true boolean := true;
l_false boolean := false;
l_number number;
begin
l_number := to_number(l_true);
l_number := to_number(l_false);
end;
/
declare
l_true boolean;
l_false boolean;
l_string varchar2(5);
begin
l_string := to_char(l_true);
l_string := to_char(l_false);
end;
/
declare
l_true boolean;
l_false boolean;
l_string nvarchar2(5);
begin
l_string := to_nchar(l_true);
l_string := to_nchar(l_false);
end;
/