Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 默认值,oracle sp调用_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

Sql 默认值,oracle sp调用

Sql 默认值,oracle sp调用,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我有一个oralcle SP,它在更新中不会接受空参数。因此,如果我想将一个值设置回默认值,它将不允许我传入空字符串。是否有一个关键字可以使用,如default、null等,oracle会将其解释回为特定列指定的默认值?强制您执行的过程: create or replace procedure notEditable(varchar2 bar) as begin --update statement null; end; 如何使用: begin notEditable(bar=&g

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

强制您执行的过程:

create or replace procedure notEditable(varchar2 bar) as
begin
  --update statement
  null;
end;
如何使用:

begin
  notEditable(bar=>null);
end;

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

强制您执行的过程:

create or replace procedure notEditable(varchar2 bar) as
begin
  --update statement
  null;
end;
如何使用:

begin
  notEditable(bar=>null);
end;

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

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

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

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>
所以,让我们尝试添加一个默认选项

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什么时候推出了这种对默认值的精确支持,但已经有一段时间了,9i

编辑


这些评论真令人沮丧。构建PL/SQLAPI的全部目的是使应用程序开发人员更容易与数据库交互。这包括足够明智地在必要时重写存储过程。用软件构建东西和(比如)将铸铁梁焊接在一起的最大区别在于,软件具有可塑性且易于更改。特别是当更改没有改变现有过程的签名或行为时,这里就是这种情况。

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

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

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>
所以,让我们尝试添加一个默认选项

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什么时候推出了这种对默认值的精确支持,但已经有一段时间了,9i

编辑



这些评论真令人沮丧。构建PL/SQLAPI的全部目的是使应用程序开发人员更容易与数据库交互。这包括足够明智地在必要时重写存储过程。用软件构建东西和(比如)将铸铁梁焊接在一起的最大区别在于,软件具有可塑性且易于更改。尤其是当更改没有改变现有程序的签名或行为时,这里就是这种情况。

我不确定是否理解。这基本上是一个更新SP,他基本上决定不使用空白值更新任何列,因此,我需要说使用空白值更新,但实际上它不是一个空字符串。我不确定我是否理解。这基本上是一个更新SP,他基本上决定不使用空白值更新任何列,因此,我需要说使用空白值更新,但实际上它不是一个空字符串您根本没有修改存储过程的选项,对吗?不,我不确定这是否可能,但我真的不习惯将SP用于crud。程序本身是否验证参数?是的,它很糟糕。他查找它是一个空字符串,如果是,则不在update语句中使用它。他是谁?听起来你在团队合作而不是代码方面有问题。不幸的是,试图用技术手段解决政治问题只会产生糟糕的代码。你根本没有修改存储过程的选择权,对吗?不,我不确定这是否可行,但我不太习惯将SP用于crud。过程本身会验证参数吗?是的,它糟透了。他查找它是一个空字符串,如果是,则不在update语句中使用它。他是谁?听起来你在团队合作而不是代码方面有问题。不幸的是,试图用技术手段解决政治问题只会产生糟糕的代码。我做了类似的错误假设:OP可以编辑程序。是的,我不能,但我总是可以建议他这样做。不过,我怀疑这会有所帮助。他基本上添加了一个以管道分隔的列列表,如果我想将某些内容更新为默认值,他将遍历该列表。从我的角度来看,我觉得这是一个糟糕的实现。同意,这不是一个好的环境,我不想在这里抱怨,事实上,我只是想按照前面提到的那样,用技术方法解决团队问题。尽管如此,还是感谢你的帮助。我做出了类似的错误假设:OP可以编辑程序。是的,我不能,但我可以随时建议他这样做。不过,我怀疑这会有所帮助。他基本上添加了一个以管道分隔的列列表,如果我想将某些内容更新为默认值,他将遍历该列表。我觉得
从我的角度来看,这是一个糟糕的实现。我同意,这不是一个好的环境,我不想在这里抱怨,实际上我只是想按照前面提到的那样,用技术方法解决团队问题。谢谢你的帮助。