如何在DB2中编写一个存储过程,通过传递动态值来执行UPDATE / DELETE操作?

kcugc4gi  于 2023-02-22  发布在  DB2
关注(0)|答案(1)|浏览(141)

我想在DB2数据库中为UPDATEDELETE操作编写一个存储过程。
我可以通过在过程中直接提供值来实现这一点,但我希望通过传递动态值来实现这一点。
我的表格结构是-

create table emp2 (int_1 int, char_1 char(10))

下面是我的UPDATE操作的存储过程,我可以运行它,但是它的行为不符合预期。即使在调用存储过程时传递了正确的参数,更改也不会反映在DB中。

CREATE OR REPLACE PROCEDURE "DB2INST1"."UPDATE_1" (IN int_1 int, IN 
char_1 char(10)) SPECIFIC UPDATE_1
LANGUAGE SQL
DYNAMIC RESULT SETS 1

BEGIN

update emp2 set char_1=char_1 where int_1=int_1;

END;

这是我的DELETE操作存储过程,我可以成功运行它,但它删除了数据库表中的所有行,而不是删除单行:

CREATE OR REPLACE PROCEDURE "DB2INST1"."DELETE_1" (IN int_1 int) 
SPECIFIC DELETE_1
LANGUAGE SQL
DYNAMIC RESULT SETS 1

BEGIN

delete from emp2 where int_1=int_1;

END;

请提供通过在DB2数据库中传递动态值为UPDATEDELETE操作创建存储过程的语法。

iyzzxitl

iyzzxitl1#

问题是您没有限定同名的列和参数。
根据References to SQL parameters, SQL variables, and global variables

    • 相同的名称应显式限定**。限定名称可明确指示名称是指列、SQL变量、SQL参数、行变量字段还是全局变量。如果名称未限定,或者限定但仍不明确,则以下规则将说明名称是指列、SQL变量、SQL参数还是全局变量:
    • 如果在SQL例程主体中指定的表和视图在创建例程时已存在,则首先将名称作为列名进行检查。如果未找到列名,则将其作为复合语句中的SQL变量进行检查,然后作为SQL参数进行检查,最后作为全局变量进行检查。**

也就是说,以下更改所有表行的语句显然是等效的:

update emp2 set char_1 = char_1 where int_1 = int_1;
--and 
update emp2 e set e.char_1 = e.char_1 where e.int_1 = e.int_1;

如果希望使用相同的列名和参数名(这里使用例程名UPDATE_1进行参数限定),则需要将此语句重写为以下语句。

update emp2 set char_1 = UPDATE_1.char_1 where int_1 = UPDATE_1.int_1

fiddle

相关问题