【问题标题】:default value, oracle sp call默认值,oracle sp 调用
【发布时间】:2010-02-28 17:33:13
【问题描述】:

我强制使用了一个 oracle SP,它不会在更新中接受空参数。因此,如果我想将一个值设置回 ('') 的默认值,它不会让我传入空字符串。是否有可以使用的关键字,例如 default、null 等,oracle 会将其解释回为特定列指定的默认值?

【问题讨论】:

  • 您根本没有修改存储过程的选项,对吗?
  • 不,我不确定这是否可能,但我真的不习惯使用 SP 来处理垃圾。
  • 过程本身是否对参数进行验证?
  • 是的,很糟糕。他寻找它是一个空字符串,如果是,则不在更新语句中使用它。
  • 这个“他”是谁?听起来您在团队合作而不是代码方面存在问题。不幸的是,试图用技术方法解决政治问题只会导致代码很糟糕。

标签: sql oracle stored-procedures plsql


【解决方案1】:

有时事情就像你希望的那样简单。

首先,一个有默认值的表……

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 ???)

编辑

cmets 真的很郁闷。构建 PL/SQL API 的全部目的是让应用程序开发人员更容易与数据库交互。这包括在必要时足够明智地重写存储过程。使用软件构建某些东西与将铸铁大梁焊接在一起之间的最大区别在于,软件具有延展性并且易于更改。特别是当更改不会改变现有过程的签名或行为时,就是这种情况。

【讨论】:

  • 我做了类似的错误假设:OP 可以编辑程序。
  • 是的,我不能,但我总是可以建议他这样做。怀疑它会有所帮助。他基本上添加了一个管道分隔的列列表,如果我想将某些内容更新为默认值,他会遍历该列表。从我的角度来看,我觉得这是一个可怕的实现。
  • 同意,这不是一个好的环境,我并不是想在这里抱怨,实际上只是想完全按照我所说的那样,用我想的技术方法解决团队问题。尽管如此,还是感谢您的帮助。
【解决方案2】:

强加给你的程序:

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

使用方法:

begin
  notEditable(bar=>null);
end;

我实际上并没有编译,但我相信这是正确的语法。

【讨论】:

  • 不确定我是否理解。这基本上是一个更新 SP,他基本上决定不更新任何带有空白值的列,因此,我需要说用空白更新,而不是它实际上是一个空字符串
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2018-12-11
相关资源
最近更新 更多