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

  • 相关阅读:
    网站访问量和服务器带宽的选择
    PHP实现四种基本排序算法
    常用的PHP排序算法以及应用场景
    常见的mysql数据库sql语句的编写和运行结果
    MyBatis拦截器:给参数对象属性赋值
    《自律让你自由》摘要
    Java JDK1.5、1.6、1.7新特性整理(转)
    人人都能做产品经理吗?
    Windows下查询进程、端口
    一语收录(2016-09-18)
  • 原文地址:https://www.cnblogs.com/yang5201314/p/6378909.html
Copyright © 2011-2022 走看看