PLSQL两个表对比的问题
你好,根据你的建议,改了代码,但是最后发现cux_contract_final_zj_temp未插入任何数据。程序的目的:通过比较两个表cux_contract_fina...
你好,根据你的建议,改了代码,但是最后发现cux_contract_final_zj_temp未插入任何数据。
程序的目的:通过比较两个表cux_contract_final_zj_sr(收入)和cux_contract_final_zj_cb(成本)中的name字段,进行模糊匹配(收入的no和成本的no是不一致的),并合并成一张表,因为匹配的name字段,完全匹配的字符数越大,匹配成功的概率越高,所以优先从100个字符开始减少。
CREATE OR REPLACE PROCEDURE cux_contract_final_fix IS
CURSOR CUR_A IS SELECT ccs.ht_no, ccs.ht_name FROM cux_contract_final_zj_sr ccs;
CURSOR CUR_B IS SELECT ccb.ht_no, ccb.ht_name FROM cux_contract_final_zj_cb ccb;
C_A CUR_A%ROWTYPE;
C_B CUR_B%ROWTYPE;
BEGIN
--取A表数据
OPEN CUR_A;
LOOP
FETCH CUR_A
INTO C_A;
EXIT WHEN CUR_A%NOTFOUND;
--每从A中取出一条记录需要遍历B中所有记录进行比较
OPEN CUR_B;
LOOP
FETCH CUR_B
INTO C_B;
EXIT WHEN CUR_B%NOTFOUND;
--截取字符的大小,自行调整。
FOR I IN 1 .. 100 LOOP
--此处为写C表的判断条件,自己根据需求修改 if目的不重复插入记录
if (SUBSTR(C_A.ht_name, 0, I) = SUBSTR(C_B.ht_name, 0, I) and SUBSTR(C_A.ht_name, 0, I) <> (select cc.SRName from cux_contract_final_zj_temp cc) and
SUBSTR(C_B.ht_name, 0, I) <> (select cc.CBName from cux_contract_final_zj_temp cc)) THEN
INSERT INTO cux_contract_final_zj_temp
VALUES
(SUBSTR(C_A.ht_name, 0, I),
C_A.ht_no,
C_A.ht_name,
C_B.ht_no,
C_B.ht_name,
I);
commit;
END IF;
END LOOP;
END LOOP;
CLOSE CUR_B;
END LOOP;
CLOSE CUR_A;
EXCEPTION
WHEN OTHERS THEN
NULL;
END cux_contract_final_fix; 展开
程序的目的:通过比较两个表cux_contract_final_zj_sr(收入)和cux_contract_final_zj_cb(成本)中的name字段,进行模糊匹配(收入的no和成本的no是不一致的),并合并成一张表,因为匹配的name字段,完全匹配的字符数越大,匹配成功的概率越高,所以优先从100个字符开始减少。
CREATE OR REPLACE PROCEDURE cux_contract_final_fix IS
CURSOR CUR_A IS SELECT ccs.ht_no, ccs.ht_name FROM cux_contract_final_zj_sr ccs;
CURSOR CUR_B IS SELECT ccb.ht_no, ccb.ht_name FROM cux_contract_final_zj_cb ccb;
C_A CUR_A%ROWTYPE;
C_B CUR_B%ROWTYPE;
BEGIN
--取A表数据
OPEN CUR_A;
LOOP
FETCH CUR_A
INTO C_A;
EXIT WHEN CUR_A%NOTFOUND;
--每从A中取出一条记录需要遍历B中所有记录进行比较
OPEN CUR_B;
LOOP
FETCH CUR_B
INTO C_B;
EXIT WHEN CUR_B%NOTFOUND;
--截取字符的大小,自行调整。
FOR I IN 1 .. 100 LOOP
--此处为写C表的判断条件,自己根据需求修改 if目的不重复插入记录
if (SUBSTR(C_A.ht_name, 0, I) = SUBSTR(C_B.ht_name, 0, I) and SUBSTR(C_A.ht_name, 0, I) <> (select cc.SRName from cux_contract_final_zj_temp cc) and
SUBSTR(C_B.ht_name, 0, I) <> (select cc.CBName from cux_contract_final_zj_temp cc)) THEN
INSERT INTO cux_contract_final_zj_temp
VALUES
(SUBSTR(C_A.ht_name, 0, I),
C_A.ht_no,
C_A.ht_name,
C_B.ht_no,
C_B.ht_name,
I);
commit;
END IF;
END LOOP;
END LOOP;
CLOSE CUR_B;
END LOOP;
CLOSE CUR_A;
EXCEPTION
WHEN OTHERS THEN
NULL;
END cux_contract_final_fix; 展开
展开全部
for循环的部分改成如下:
--从两表中name列中最短的字段开始递减循环
FOR I IN REVERSE 0..LEAST(LENGTH(C_A.ANAME),LENGTH(C_B.BNAME)) LOOP
--如果存在第一个相等的值,则写入C表并退出,进行下一次比较
IF SUBSTR(C_A.ANAME,0,I) = SUBSTR(C_B.BNAME,0,I) THEN
INSERT INTO C VALUES (C_A.ANO,C_A.ANAME,C_B.BNO,C_B.BNAME,I);
COMMIT;
EXIT;
END IF;
END LOOP;
代码是根据我上次写的改的, 你再根据你的表结构改下。
你的IF判断是有问题的,语法跟逻辑都不正确。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询