问题描述
我有一个包含4列的表,并且传递了这4列的输入值和新旧值,以更新它们,如下所示。
_________________________________________
创建表(列1 IN VARCHAR2 ,
列2在VARCHAR2中,
列3在VARCHAR2中,
列4在VARCHAR2中,
)
插入到表值中('as','af','gh','kl') ;
插入到表值('ss','sf','sh','sl')中;
插入到表的值('s1','ssf','sfh','sasFL')中;
过程test1( old-Teron1 IN VARCHAR2 ,
old列2在VARCHAR2中,
old列3在VARCHAR2中,
old列4在VARCHAR2中,
VARCHAR2中的新列1 ,
new列2在VARCHAR2中,
new列3在VARCHAR2中,
新列4在VARCHAR2)
________________________________________
这里的要求是用新的值更新这4列,其中实际列值等于旧列输入,但不能保证用户可以在everttime传递所有4列值。
如果它们传递oldcolumn1值,则只需更新列1。
如果它们传递了old-ream4的值,则只需更新列4。
如果它们通过olcalmn1和old-ream5 ,则需要更新列1和列5。
你能建议一种在这种情况下如何写更新声明吗?
_________________________________________
创建表(列1 IN VARCHAR2 ,
列2在VARCHAR2中,
列3在VARCHAR2中,
列4在VARCHAR2中,
)
插入到表值中('as','af','gh','kl') ;
插入到表值('ss','sf','sh','sl')中;
插入到表的值('s1','ssf','sfh','sasFL')中;
过程test1( old-Teron1 IN VARCHAR2 ,
old列2在VARCHAR2中,
old列3在VARCHAR2中,
old列4在VARCHAR2中,
VARCHAR2中的新列1 ,
new列2在VARCHAR2中,
new列3在VARCHAR2中,
新列4在VARCHAR2)
________________________________________
这里的要求是用新的值更新这4列,其中实际列值等于旧列输入,但不能保证用户可以在everttime传递所有4列值。
如果它们传递oldcolumn1值,则只需更新列1。
如果它们传递了old-ream4的值,则只需更新列4。
如果它们通过olcalmn1和old-ream5 ,则需要更新列1和列5。
你能建议一种在这种情况下如何写更新声明吗?
专家解答
听起来你需要一些动态SQL !
检查每个输入值是否为空。如果有值,请将其添加到更新字符串中。
在构建更新语句时,请确保您使用的是绑定变量!
例如:
检查每个输入值是否为空。如果有值,请将其添加到更新字符串中。
在构建更新语句时,请确保您使用的是绑定变量!
例如:
create table t
(
column1 varchar2(10), column2 varchar2(10),
column3 varchar2(10), column4 varchar2(10)
);
insert into t values
( 'as','af','gh','kl'
) ;
insert into t values
( 'ss','sf','sh','sl'
) ;
insert into t values
( 's1','ssf','sfh','sasfl'
) ;
create or replace procedure test1
(
oldcolumn1 in varchar2, oldcolumn2 in varchar2,
oldcolumn3 in varchar2, oldcolumn4 in varchar2,
newcolumn1 in varchar2, newcolumn2 in varchar2,
newcolumn3 in varchar2, newcolumn4 in varchar2
)
as
update_sql varchar2(4000) := 'update t';
where_clause varchar2(4000) := 'where 1=1';
set_clause varchar2(4000) := 'set ';
cur binary_integer;
dummy int;
no_input exception;
begin
if coalesce ( oldcolumn1, oldcolumn2, oldcolumn3, oldcolumn4) is null then
raise no_input;
end if;
if oldcolumn1 is not null then
set_clause := set_clause || 'column1 = :new1,';
where_clause := where_clause || ' and column1 = :old1';
end if;
if oldcolumn2 is not null then
set_clause := set_clause || 'column2 = :new2,';
where_clause := where_clause || ' and column2 = :old2';
end if;
set_clause := substr(set_clause, 1, length(set_clause)-1);
update_sql := update_sql || ' ' || set_clause || ' ' || where_clause;
cur := dbms_sql.open_cursor;
dbms_sql.parse(cur, update_sql, dbms_sql.native);
if oldcolumn1 is not null then
dbms_sql.bind_variable(cur, 'old1', oldcolumn1);
dbms_sql.bind_variable(cur, 'new1', newcolumn1);
end if;
if oldcolumn2 is not null then
dbms_sql.bind_variable(cur, 'old2', oldcolumn2);
dbms_sql.bind_variable(cur, 'new2', newcolumn2);
end if;
dummy := dbms_sql.execute(cur);
dbms_sql.close_cursor(cur);
end;
/
select * from t;
COLUMN1 COLUMN2 COLUMN3 COLUMN4
---------- ---------- ---------- ----------
as af gh kl
ss sf sh sl
s1 ssf sfh sasfl
exec test1('as', null, null, null, 'c', null, null, null);
select * from t;
COLUMN1 COLUMN2 COLUMN3 COLUMN4
---------- ---------- ---------- ----------
c af gh kl
ss sf sh sl
s1 ssf sfh sasfl
exec test1(null, 'af', null, null, null, 'd', null, null);
select * from t;
COLUMN1 COLUMN2 COLUMN3 COLUMN4
---------- ---------- ---------- ----------
c d gh kl
ss sf sh sl
s1 ssf sfh sasfl
exec test1('ss', 'ssf', null, null, 'e', 'f', null, null);
select * from t;
COLUMN1 COLUMN2 COLUMN3 COLUMN4
---------- ---------- ---------- ----------
c d gh kl
ss sf sh sl
s1 ssf sfh sasfl 「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




