達(dá)夢(mèng) Oracle 生成 insertOrUpdate 插入更新函數(shù)模板

達(dá)夢(mèng) Oracle 生成 insertOrUpdate 插入更新函數(shù)模板

[MySQL] ON DUPLICATE KEY UPDATE

  • 達(dá)夢(mèng) 和 Oracle 不支持 ON DUPLICATE KEY UPDATE翎苫,手寫相關(guān)插入更新方法十分繁瑣篡撵,以下就是生成模板的相關(guān)代碼

自定義函數(shù)

CREATE OR REPLACE FUNCTION insertOnUpdate(
    p_table_name VARCHAR2,
    v_java NUMBER := 1)
    RETURN CLOB
AS
    v_is_pk      PLS_INTEGER := 0;
    v_tf_c       CLOB;
    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 '此表沒(méi)有主鍵捆愁,無(wú)法生成旁振!';
        END IF;
    --循環(huán)所有字段
    FOR dj IN
        (
        SELECT LOWER(a.column_name) column_name
        FROM user_tab_columns a
        WHERE a.table_name = UPPER(p_table_name)
        GROUP BY a.column_name,
                 a.column_id
        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);
            --關(guān)聯(lián)語(yǔ)句
            IF v_is_pk = 1
                THEN
                    v_sql_join := v_sql_join || ' and a.' || dj.column_name || '=b.' || dj.column_name;
                END IF;

            -- tf
            SELECT LOWER(SUBSTR(dj.column_name, 1, 1)) || SUBSTR(REPLACE(INITCAP(dj.column_name), '_', ''), 2)
            INTO v_tf_c
            FROM dual;
            --參數(shù)語(yǔ)句
            v_sql_param := v_sql_param || ', #{item.' || v_tf_c || '} as ' || dj.column_name;

            IF v_is_pk = 0
                THEN
                    --更新語(yǔ)句
                    v_sql_update := v_sql_update || ' ,m.' || dj.column_name || '=t.' || dj.column_name || CHR(10);
                END IF;
            --插入語(yǔ)句
            v_sql_query := v_sql_query || ' ,' || dj.column_name;
            v_sql_insert := v_sql_insert || ' ,t.' || 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 || ' m ' || CHR(10);
    v_sql_total := v_sql_total || 'using (<foreach collection="list" item="item" separator="UNION ALL"> select ' ||
                   SUBSTR(v_sql_param, 3) || ' from dual </foreach>) t ' || 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 || ' m' || 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;

使用函數(shù)生成代碼

SELECT insertOnUpdate('healthy_config_detail') FROM dual;

生成案例

merge into healthy_config_detail m
        using (
<foreach collection="list" item="item" separator="UNION ALL">select #{item.id} as id, #{item.type} as type,
    #{item.dataId} as data_id, #{item.dataName} as data_name, #{item.name} as name, #{item.createTime} as create_time,
    #{item.score} as score, #{item.description} as description, #{item.delFlag} as del_flag, #{item.updateTime} as
    update_time, #{item.status} as status from dual
</foreach>) t
        on (t.id=m.id)
        when matched then update set
        m.type=t.type
        ,m.data_id=t.data_id
        ,m.data_name=t.data_name
        ,m.name=t.name
        ,m.create_time=t.create_time
        ,m.score=t.score
        ,m.description=t.description
        ,m.del_flag=t.del_flag
        ,m.update_time=t.update_time
        ,m.status=t.status
        when not matched then
        insert(id ,type ,data_id ,data_name ,name ,create_time ,score ,description ,del_flag ,update_time ,status)
        values(t.id ,t.type ,t.data_id ,t.data_name ,t.name ,t.create_time ,t.score ,t.description ,t.del_flag ,t.update_time ,t.status)

注意問(wèn)題

  • 插入更新數(shù)據(jù)不能太多萧诫,不然會(huì)提示嵌套層次太多
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摔认,隨后出現(xiàn)的幾起案子狼荞,更是在濱河造成了極大的恐慌,老刑警劉巖闽寡,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代兵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爷狈,警方通過(guò)查閱死者的電腦和手機(jī)奢人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淆院,“玉大人何乎,你說(shuō)我怎么就攤上這事⊥帘纾” “怎么了支救?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拷淘。 經(jīng)常有香客問(wèn)我各墨,道長(zhǎng),這世上最難降的妖魔是什么启涯? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任贬堵,我火速辦了婚禮恃轩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黎做。我一直安慰自己叉跛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布蒸殿。 她就那樣靜靜地躺著筷厘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宏所。 梳的紋絲不亂的頭發(fā)上酥艳,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音爬骤,去河邊找鬼充石。 笑死,一個(gè)胖子當(dāng)著我的面吹牛霞玄,可吹牛的內(nèi)容都是我干的骤铃。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼溃列,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劲厌!你這毒婦竟也來(lái)了膛薛?” 一聲冷哼從身側(cè)響起听隐,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哄啄,沒(méi)想到半個(gè)月后雅任,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咨跌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年沪么,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌半。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禽车,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刊殉,到底是詐尸還是另有隱情殉摔,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布记焊,位于F島的核電站逸月,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遍膜。R本人自食惡果不足惜碗硬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一瓤湘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恩尾,春花似錦弛说、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猎物,卻和暖如春虎囚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔫磨。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工淘讥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堤如。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓蒲列,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀罢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝗岖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容