Testing a new feature in 23ai that allows you to define a DEFAULT value for a column if a user/front-end/application sends a NULL :
[oracle@oel9 ~]$ sqlplus hemant/hemant@freepdb1
SQL*Plus: Release 23.0.0.0.0 - Production on Thu May 9 14:54:25 2024
Version 23.4.0.24.05
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.4.0.24.05
SQL> create table my_new_employees(
2 employee_id number(12) primary key,
3 employee_name varchar2(48),
4 department_id number(12)
5 )
6 /
Table created.
SQL>
SQL> insert into my_new_employees
2 values (1,'Hemant',NULL)
3 /
1 row created.
SQL>
SQL> select * from my_new_employees;
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
----------- ------------------------------------------------ -------------
1 Hemant
SQL>
SQL> update my_new_employees
2 set department_id=100 -- setting a non-NULL value
3 where employee_id=1
4 /
1 row updated.
SQL> select * from my_new_employees;
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
----------- ------------------------------------------------ -------------
1 Hemant 100
SQL>
SQL> alter table my_new_employees
2 modify (department_id default on null for insert and update 512);
Table altered.
SQL> insert into my_new_employees
2 values (2,'Larry'); -- I am not specifying a value for DEPARTMENT_ID
insert into my_new_employees
*
ERROR at line 1:
ORA-00947: not enough values
Help: https://docs.oracle.com/error-help/db/ora-00947/
SQL> insert into my_new_employees
2 values(2,'Larry', NULL); -- I explicitly specify NULL for DEPARTMENT_ID
1 row created.
SQL> select * from my_new_employees order by 1;
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
----------- ------------------------------------------------ -------------
1 Hemant 100
2 Larry 512 -- it got set to 512 ON INSERT
SQL>
SQL> update my_new_employees
2 set employee_name = 'Hemant Chitale', department_id=NULL -- I explicitly specify NULL for DEPARMTENT_ID
3 where employee_id=1
4 /
1 row updated.
SQL> select * from my_new_employees order by 1;
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
----------- ------------------------------------------------ -------------
1 Hemant Chitale 512 -- it got set to 512 ON UPDATE
2 Larry 512
SQL>
SQL> commit;
Commit complete.
SQL> select * from my_new_employees order by 1;
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_ID
----------- ------------------------------------------------ -------------
1 Hemant Chitale 512
2 Larry 512
SQL>
So, now the column has a proper DEFAULT value when an UPDATE statement sends a NULL. This allows the developer to avoid having to write a Front-End Value Check or a Database Table Trigger to convert an incoming NULL to a DEFAULT value.
No comments:
Post a Comment