Иногда все так просто, как вы надеетесь.
Сначала таблица со значением по умолчанию ...
SQL> create table t23 (
2 id number not null primary key
3 , col_d date default sysdate not null )
4 /
Table created.
SQL> insert into t23 values (1, trunc(sysdate, 'yyyy'))
2 /
1 row created.
SQL> select * from t23
2 /
ID COL_D
---------- ---------
1 01-JAN-10
SQL>
Далее процедура, которая обновляет столбец по умолчанию ...
SQL> create or replace procedure set_t23_date
2 ( p_id in t23.id%type
3 , p_date in t23.col_d%type )
4 is
5 begin
6 update t23
7 set col_d = p_date
8 where id = p_id;
9 end;
10 /
Procedure created.
SQL>
... но не работает так, как хотелось бы:
SQL> exec set_t23_date ( 1, null )
BEGIN set_t23_date ( 1, null ); END;
*
ERROR at line 1:
ORA-01407: cannot update ("APC"."T23"."COL_D") to NULL
ORA-06512: at "APC.SET_T23_DATE", line 6
ORA-06512: at line 1
SQL>
Итак, давайте попробуем добавить опцию DEFAULT ...
SQL> create or replace procedure set_t23_date
2 ( p_id in t23.id%type
3 , p_date in t23.col_d%type )
4 is
5 begin
6 if p_date is not null then
7 update t23
8 set col_d = p_date
9 where id = p_id;
10 else
11 update t23
12 set col_d = default
13 where id = p_id;
14 end if;
15 end;
16 /
Procedure created.
SQL>
... и вот!
SQL> exec set_t23_date ( 1, null )
PL/SQL procedure successfully completed.
SQL>
SQL> select * from t23
2 /
ID COL_D
---------- ---------
1 28-FEB-10
SQL>
Я запустил этот пример в базе данных 11g. Я не могу вспомнить, когда Oracle представила эту точную поддержку DEFAULT, но это было довольно давно (9i ???)
редактировать
Комментарии действительно удручают. Весь смысл создания API PL / SQL состоит в том, чтобы сделать более легкими для разработчиков приложений, взаимодействующих с базой данных. Это включает в себя быть достаточно разумным, чтобы переписать хранимые процедуры при необходимости. Большая разница между созданием чего-то из программного обеспечения и, скажем, сваркой чугунных балок в том, что программное обеспечение податливо и его легко менять. Особенно, когда изменение не изменяет подпись или поведение существующей процедуры, как здесь.