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

  • 相关阅读:
    挑战程序设计竞赛 2.1 最基础的“穷竭搜索”
    HDU 5145 NPY and girls(莫队算法+乘法逆元)
    BZOJ 4300 绝世好题(位运算)
    HDU 5724 Chess(博弈论)
    BZOJ 1177 [Apio2009]Oil(递推)
    Codeforces 706D Vasiliy's Multiset(可持久化字典树)
    HDU 3374 String Problem (KMP+最小最大表示)
    POJ 2758 Checking the Text(Hash+二分答案)
    HDU 5782 Cycle(KMP+Hash)
    POJ 3450 Corporate Identity(KMP)
  • 原文地址:https://www.cnblogs.com/yang5201314/p/6378909.html
Copyright © 2011-2022 走看看