暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle更新语句

askTom 2016-04-22
217

问题描述

我有一个包含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。

你能建议一种在这种情况下如何写更新声明吗?

专家解答

听起来你需要一些动态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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论