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;
展开
 我来答
253654522
2014-11-21 · TA获得超过138个赞
知道小有建树答主
回答量:134
采纳率:0%
帮助的人:182万
展开全部

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判断是有问题的,语法跟逻辑都不正确。

来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式