我有一個包含一些列和兩個 CLOBS 的表。
在某些情況下,兩個 CLOBS 包含完全相同的值,而在其他情況下,它們包含不同的值。或者其中一個或兩個 CLOBS 可以為空或 NUL1。
我創建了一個函式,我想呼叫它來比較兩個 CLOBS 以確定值是“相同”還是不同。
CREATE or REPLACE FUNCTION HASH_SHA512 (
psINPUT IN VARCHAR2
) RETURN VARCHAR2 AS
rHash RAW (512);
BEGIN
rHash := DBMS_CRYPTO.HASH (TO_CLOB (psINPUT),
dbms_crypto.HASH_SH512);
RETURN (LOWER (RAWTOHEX (rHash)));
END HASH_SHA512;
/
CREATE table table_x(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
val NUMBER,
clob1 CLOB,
clob2 CLOB);
insert into table_x (val, clob1, clob2) values (1,'aaaaaaaaaa','aaaaaaaaaa');
insert into table_x (val, clob1, clob2) values (1,'aaaaa','aaaaaaaaaa');
insert into table_x (val, clob1, clob2) values (2,'Xaaaaaaaaa','aaaaaaaaaa');
Expected output
SEQ_NUM VAL CLOB1 CLOB2
1 1 aaaaaaaaaa aaaaaaaaaa SAME
2 1 aaaaa aaaaaaaaaa DIFFERENT
3 2 Xaaaaaaaaa aaaaaaaaaa DIFFERENT
根據上述查詢的輸出,如果 SHA512 輸出顯示的差異相同,我想在下面的新表中插入 1 行。如果輸出不同,我想在下表中插入 2 行。
CREATE table table_z(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
val NUMBER,
hash_val VARCHAR2(1000) not NULL PRIMARY KEY,
clob_val CLOB);
uj5u.com熱心網友回復:
撰寫自己的函式來比較兩個 LOB 沒有多大意義,因為 OracleCOMPARE在DBMS_LOB包中已經有一個函式。它可以很容易地在您的查詢中使用,如下所示:
SELECT x.*,
CASE DBMS_LOB.compare (x.clob1, x.clob2) WHEN 0 THEN 'SAME' ELSE 'DIFFERENT' END AS comparison
FROM table_x x;
SEQ_NUM VAL CLOB1 CLOB2 COMPARISON
__________ ______ _____________ _____________ _____________
1 1 aaaaaaaaaa aaaaaaaaaa SAME
2 1 aaaaa aaaaaaaaaa DIFFERENT
3 2 Xaaaaaaaaa aaaaaaaaaa DIFFERENT
要將不同的 CLOB 插入到table_z您可以使用這樣的 SQL 陳述句:
INSERT INTO table_z (val, hash_val, clob_val)
SELECT x1.val, DBMS_CRYPTO.HASH (x1.clob1, 6 /*DBMS_CRYPTO.HASH_SH512*/
), x1.clob1
FROM table_x x1
UNION ALL
SELECT x2.val, DBMS_CRYPTO.HASH (x2.clob2, 6 /*DBMS_CRYPTO.HASH_SH512*/
), x2.clob2
FROM table_x x2
WHERE DBMS_LOB.compare (x2.clob1, x2.clob2) <> 0;
目前,您定義的 PRIMARY KEYtable_z將阻止您提供的示例記錄插入,因為相同的 CLOB 出現在多行上。您可以洗掉該主鍵或向主鍵添加其他列以允許插入資料。
uj5u.com熱心網友回復:
您可以使用“table_x”處的觸發器解決此問題。
https://docs.oracle.com/cd/B13789_01/appdev.101/b10795/adfns_tr.htm
→ 在此觸發器的 PL-SQL-Code 中,您可以區分“相同”和“不同”的情況。
此觸發器應如下所示:
CREATE OR REPLACE TRIGGER compare_table_x
BEFORE INSERT ON table_x
FOR EACH ROW
DECLARE
compare table_x.compare;
BEGIN
IF compare = 'SAME' THEN
INSERT ...
ELSE
INSERT ...
INSERT ...
END IF;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376672.html
