微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与多行选择合并

如何解决与多行选择合并

我有一个查询,每次运行时,都会选择与表(p_table_name_in)相关的 user_triggers 行。我想每天运行这个过程,我只想插入新行,而不是再次插入所有行。但是当我安装这个 oackage 时,我收到这个错误

ORA-00932 (130: 21):PL/sql:ORA-00932:不一致的数据类型: CLOB 预期,LONG 收到(第 31 行)

当我尝试将 TRIGGER_BODY AS BODY_TRIGGER 更改为 TO_LOB(TRIGGER_BODY) AS BODY_TRIGGER 时,我收到此错误

ORA-00932 (111: 29):PL/sql:ORA-00932:不一致的数据类型:- 预期,收到 LONG(第 12 行)

程序:

PROCEDURE save_trigger_deFinitions ( p_table_name_in in VARCHAR2 ) IS        
BEGIN                  
        MERGE INTO hot_utils_reload_triggers t1
        USING
        (
        SELECT TRIGGER_NAME,TABLE_NAME,STATUS,DESCRIPTION,TRIGGER_BODY AS BODY_TRIGGER,WHEN_CLAUSE 
                FROM user_triggers
        )t2
        ON(t2.TABLE_NAME like upper(p_table_name_in))
        WHEN MATCHED THEN UPDATE SET
            t1.DESCRIPTION = t2.DESCRIPTION,t1.WHEN_CLAUSE = t2.WHEN_CLAUSE
        WHEN NOT MATCHED THEN 
            INSERT (TRIGGER_NAME,BODY_TRIGGER,WHEN_CLAUSE)
            VALUES (t2.TRIGGER_NAME,t2.TABLE_NAME,t2.STATUS,t2.DESCRIPTION,t2.BODY_TRIGGER,t2.WHEN_CLAUSE); 
            commit;
END save_trigger_deFinitions;

解决方法

令我感兴趣的是,Oracle 不允许在 TO_LOBSELECT 语句中使用 MERGE,而在 INSERT 中允许使用。因此,您可以单独使用 INSERTMERGE 仅包含 MATCHED 部分的部分,例如

CREATE OR REPLACE PROCEDURE save_trigger_definitions ( p_table_name_in in VARCHAR2 ) IS    
BEGIN  
    INSERT INTO hot_utils_reload_triggers
        (trigger_name,table_name,status,description,body_trigger,when_clause)
    SELECT trigger_name,TO_LOB(trigger_body),when_clause
      FROM user_triggers
     WHERE table_name LIKE UPPER(p_table_name_in)
       AND NOT EXISTS ( SELECT 1 
                          FROM hot_utils_reload_triggers 
                         WHERE trigger_name = u.trigger_name
                           AND table_name = u.table_name
                           AND status = u.status );

    UPDATE hot_utils_reload_triggers h
       SET h.description = description,h.when_clause = when_clause
     WHERE table_name LIKE UPPER(p_table_name_in);

    COMMIT;
END;
/

假设您不希望某些列(例如 trigger_nametable_namestatus)出现重复的行,我在 NOT EXISTS 子句之后为它们添加了一个子查询。

Ref1

Ref2

使用 DBMS_REDEFINITION.START_REDEF_TABLE() 可能是 LONGLOB 转换情况的另一种选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。