значение по умолчанию, вызов Oracle - PullRequest
2 голосов
/ 28 февраля 2010

Мне навязывают устный SP, который не будет принимать пустой параметр в обновлении. Поэтому, если я захочу вернуть значение по умолчанию (''), оно не позволит мне передать пустую строку. Есть ли ключевое слово, которое вы можете использовать, например default, null и т. Д., Которое oracle будет интерпретировать обратно к значению по умолчанию, указанному для определенного столбца?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2010

Иногда все так просто, как вы надеетесь.

Сначала таблица со значением по умолчанию ...

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 состоит в том, чтобы сделать более легкими для разработчиков приложений, взаимодействующих с базой данных. Это включает в себя быть достаточно разумным, чтобы переписать хранимые процедуры при необходимости. Большая разница между созданием чего-то из программного обеспечения и, скажем, сваркой чугунных балок в том, что программное обеспечение податливо и его легко менять. Особенно, когда изменение не изменяет подпись или поведение существующей процедуры, как здесь.

0 голосов
/ 28 февраля 2010

Процедура, которая была навязана вам:

create or replace procedure notEditable(varchar2 bar) as
begin
  --update statement
  null;
end;

Как использовать:

begin
  notEditable(bar=>null);
end;

На самом деле я не компилировал, но я верю, что это правильный синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...