zoukankan      html  css  js  c++  java
  • Oracle 自动生成merge into 语法

    create or replace function dev_merge(p_table_name varchar2, v_java number:=0) return clob

    as

    v_is_pk pls_integer:=0;

    v_sql_total clob; v_sql_join clob;

    v_sql_param clob;

    v_sql_update clob;

    v_sql_query clob;

    v_sql_insert clob;

    begin

    select count(*) into v_is_pk

    from user_cons_columns cu inner

    join user_constraints au on cu.constraint_name = au.constraint_name and au.constraint_type = 'P'

    where au.table_name = upper(p_table_name);

    if v_is_pk=0 then

      return '此表没有主键,无法生成!';

    end if;

    --循环所有字段

    for dj in (select lower(a.column_name) column_name from user_tab_columns a where a.table_name=upper(p_table_name) order by a.column_id) loop

    --获取主键

    select count(*) into v_is_pk

    from user_cons_columns cu

    inner join user_constraints au on cu.constraint_name = au.constraint_name and au.constraint_type = 'P'

    where au.table_name = upper(p_table_name) and cu.column_name=upper(dj.column_name);

    --关联语句

    if v_is_pk=1then

      v_sql_join:=v_sql_join||' and a.'||dj.column_name||'=b.'||dj.column_name;

    end if;

    --参数语句

    if v_java=0 then

      v_sql_param:=v_sql_param||', :'||dj.column_name||' as '||dj.column_name;

    else

      v_sql_param:=v_sql_param||', ? as '||dj.column_name;

    end if;

    if v_is_pk=0 then

    --更新语句

      v_sql_update:=v_sql_update||' ,a.'||dj.column_name||'=b.'||dj.column_name||chr(10);

    end if;

    --插入语句

    v_sql_query:=v_sql_query||' ,'||dj.column_name;

    v_sql_insert:=v_sql_insert||' ,b.'||dj.column_name;

    end loop;

    dbms_output.put_line(v_sql_param);

    v_sql_total:=v_sql_total||chr(10)||chr(10);

    v_sql_total:=v_sql_total||'merge into '|| p_table_name ||' a '||chr(10);

    v_sql_total:=v_sql_total||'using (select '|| substr(v_sql_param,3) ||' from dual) b '||chr(10);

    v_sql_total:=v_sql_total||'on ('||substr(v_sql_join,6)||')'||chr(10);

    v_sql_total:=v_sql_total||'when matched then update set'||chr(10);

    v_sql_total:=v_sql_total||' '||substr(v_sql_update,4);

    v_sql_total:=v_sql_total||'when not matched then'||chr(10);

    v_sql_total:=v_sql_total||' insert('||substr(v_sql_query,3)||')'||chr(10);

    v_sql_total:=v_sql_total||' values('||substr(v_sql_insert,3)||')'||chr(10)||chr(10);

    return v_sql_total;

    end;

    =================================================================================================

    最后,我们只需要把表名套进去就OK了!

    select dev_merge('表名','1') from dual

  • 相关阅读:
    (转)typedef用法
    (转)在用户空间发生中断时,上下文切换的过程
    (转)内核中断,异常,抢占总结篇
    (转)中断上下文和进程上下文的区别
    (转)C中的volatile用法
    (转)gcc学习笔记
    (转)C系程序员面试必知必会之大端小端
    (转)我在北京工作这几年 – 一个软件工程师的反省
    (转)忠告
    Linux下VLAN功能的实现 (转)
  • 原文地址:https://www.cnblogs.com/yang5201314/p/6378909.html
Copyright © 2011-2022 走看看