两个表数据比较如果不同需要做更新代码是连续执行它永远不会结束



有 2 个表.prod 和 dev. 我的要求我需要将开发数据与 prod 进行比较,如果列值为空,我需要更新为"空"作为字符串。

表的数据为 1000 行。

是的,它们具有相同的结构,因为我将创建一个 TEMP 表 A

(REVISIONCODE                 NOT NULL VARCHAR2(60)                
KEY_1                        NOT NULL VARCHAR2(60) ,ATTRIBUTE_CATEGORY                    VARCHAR2(60)                
ATTRIBUTE_INDEX                       VARCHAR2(60)                
ATTRIBUTE_STATE                       VARCHAR2(60) ).
A will be compared with B
(REVISIONCODE                 NOT NULL VARCHAR2(60)                
KEY_1                        NOT NULL VARCHAR2(60) ,ATTRIBUTE_CATEGORY                    VARCHAR2(60)                
ATTRIBUTE_INDEX                       VARCHAR2(60)                
ATTRIBUTE_STATE                       VARCHAR2(60) ).
Here Data A(DEV) is having as
REVISIONCODE        KEY_1                 Category   Index
IN_PROD             360View                         store       
IN_PROD             Alternate display name          Index
IN_PROD             Book product                    store     
Data for B(PROD) is
REVISIONCODE    KEY_1                    Category   Index
IN_PROD       360View                               Store
IN_PROD       Alternate display name        null    Index   
IN_PROD       Book product                          Store

当我在这里查看数据外表 B key_1列备用显示名称类别列的数据为"null",而在同一列中数据为空。

对于该行,我需要将列类别的表 A 行数据更新为"null"。 表 A 中还有一件事key_1 360_view类别列值在表 B 中为空,值也为空,所以我不需要考虑。

为此,你能帮我有效的方法吗,我该怎么写

我必须比较表中的 12 列。

为此,我将代码编写为

DECLARE
CURSOR C1 is select * FROM PROD  ;
CURSOR C2 IS select * FROM DEV  ;
TYPE t_stg_tab IS TABLE OF C1%ROWTYPE;
c1_var    t_stg_tab   ;
TYPE t_non_prod_tab IS TABLE OF C2%ROWTYPE;
c2_var    t_non_prod_tab ;

v_prod_upd_cntr PLS_INTEGER        := 0;
l_rec_cnt       NUMBER          := 0;
start_date      DATE            := sysdate;
BEGIN
OPEN c1;
FETCH c1   BULK COLLECT INTO c1_var ;
OPEN c2;
FETCH c2  BULK COLLECT INTO c2_var ;
FOR I IN 1..C1_VAR.COUNT LOOP
FOR J IN 1..C2_VAR.COUNT LOOP
IF c2_var(j).revisioncode =c1_var(i).revisioncode and c2_var(j).key_1 = c1_var(i).key_1 then
dbms_output.put_line('c1_var(i).attribute_category'||c1_var(i).attribute_category||'c1_var(i).revisioncode'||c1_var(i).revisioncode||'c2_var(j).key_1'||c2_var(j).key_1);
dbms_output.put_line('c2_var(j).attribute_category'||c2_var(j).attribute_category||'c2_var(j).revisioncode'||c2_var(j).revisioncode||'c2_var(j).key_1'||c2_var(j).key_1);
IF c1_var(i).attribute_category is not null then
IF c1_var(i).attribute_category = 'null' and c2_var(j).attribute_category is null then
dbms_output.put_line('c2_var(j).attribute_category_empty_need_update'||c2_var(j).attribute_category);
--    UPDATE P_MD_CE05_ATR_RVSNCD_KEY_TST set attribute_category = 'null' where  revisioncode = c2_var(j).revisioncode and key_1 = c2_var(j).key_1 ;
l_update_attribute_category := 'null';
ELSE
dbms_output.put_line('c2_var(j).attribute_category_No update'||c2_var(j).attribute_category);
END IF;
END IF;
END IF;
UPDATE P_MD_CE05_ATR_RVSNCD_KEY_TST set attribute_category = l_update_attribute_category  ;
l_rec_cnt := SQL%ROWCOUNT;
v_prod_upd_cntr := v_prod_upd_cntr + l_rec_cnt;
DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
END LOOP;

DBMS_OUTPUT.PUT_LINE('after first end loop rowcount_value'||i);
DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
END LOOP;
DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
--   DBMS_OUTPUT.PUT_LINE('at end rowcount_value1'||i||'rowcount2'||j);
Exception
when others then
dbms_output.put_Line('SQLCODE'||SQLCODE||' -ERROR- '||SQLERRM)  ;
END;

当我执行数据库没有响应时,我需要取消操作。

在这种特殊情况下,您的描述毫无意义。尝试用业务术语描述您的问题,然后发布表的实际 DDL。还要提供示例测试数据(文本而不是图像(以及该数据的预期结果。

至于你的代码,它本质上是一个嵌套循环连接,自己编写它是最慢的方式。如前所述,您有 1M 次迭代,并且您更新目标表中每一行

。所以把它写成加入。甲骨文有40 +年的经验,我向你保证,他们比我们中的任何一个都做得更好。如果索引得当,甲骨文可能会想出更好的方法。以下内容应实现循环和if结构(更新除外(。

select c1.*, c2.*
from prod  c1
join dev   c2
on (c2.revisioncode = c1.revivioncode and
c2.key_1        = c1.key_1
)
where c1.attribute_category = 'null'
and c2.attribute_category is null;

结果应为您提供传递IF语句并执行语句l_update_attribute_category := 'null';的相同行。

上述 SQL 语句将独立运行,但不会在过程块中运行。那是因为我没有尝试更新,因为您没有提供表Prod和/或Dev之间的关系。这是假设ProdDev引用而不是环境。(我怀疑它们是环境。如果它们是环境,请修改您的问题。

我有点猜测,但我想这可以在一个 SQL 语句中完成。

最新更新