The Oracle database does not have the BOOLEAN datatype. No direct way to represent that a column like IS_ACTIVE on table ITEMS is TRUE or FALSE.
The good news is that there are simple workarounds to the situation.
How to simulate a BOOLEAN-valued column in a table?
The most popular way is to create the table with a CHAR(1) column, on which a check constraint is placed.
SQL> create table items 2 ( item_no number(3), 3 isactive char(1) check (isactive in ('Y','N')) 4 ); Table created. SQL> SQL> insert into items 2 values (101, 'Y'); 1 row created. SQL> SQL> insert into items 2 values (101, 'X'); insert into items * ERROR at line 1: ORA-02290: check constraint (SCOTT.SYS_C0012084) viola SQL> SQL> insert into items 2 values (101, 'N'); 1 row created.
A better way is to use a NUMBER(1) column, and use 0/1 to stand for FALSE/TRUE. I call it better, as NUMBER(1) is not language-dependent. Y/N presupposes that the language in use is English. Numbers make no such assumptions.
BOOLEANs exist in PL/SQL!
Interestingly, PL/SQL does have a boolean datatype. A boolean PL/SQL variable can take the values TRUE, FALSE or NULL. It is a pity that this handy PL/SQL variable cannot be made use of conveniently in SQL. You cannot insert the PL/SQL boolean value into a table column, or fetch from a table column into a PL/SQL boolean variable.
An example of using this datatype in a PL/SQL procedure:
SQL> create or replace procedure chkequal 2 ( a number 3 , b number) 4 as 5 isequal boolean; 6 begin 7 isequal := (a = b); 8 if (isequal) then 9 dbms_output.put_line('Input values are equal'); 10 else 11 dbms_output.put_line('Input values not equal') 12 end if; 13 end; 14 / Procedure created. SQL> exec chkequal (3,3); Input values are equal PL/SQL procedure successfully completed. SQL> exec chkequal (3,4); Input values not equal PL/SQL procedure successfully completed.
- Oracle does not have a BOOLEAN datatype.
- A NUMBER(1) column with a check constraint to allow values 0 or 1 is a good alternative for the BOOLEAN datatype. CHAR(1) or VARCHAR(1) are fine too, but they are not language-independent.
- PL/SQL has a BOOLEAN datatype, but you cannot insert this value directly into a table or fetch from a table column directly into a PL/SQL boolean variable.