【问题标题】:Update of two same tables on different oracle schemas using primary key使用主键更新不同 oracle 模式上的两个相同表
【发布时间】:2015-02-26 13:01:59
【问题描述】:

我正在摸索以良好的性能解决问题,我们设法通过使用哈希映射在java中找到解决方案,但是由于表包含1L记录,这部分很难管理。

我正在寻找最好的选择。

我在同一个 oracle 数据库上有两个模式。我需要使用主键用另一个模式表更新一个表(如果主键行存在,我们只需要更新,我们不应该插入它)。

假设我的 oracle 数据库是 TEST,我有两个架构的 SCHEMA1 和 SCHEMA2。

SCHEMA1 和 SCHEMA2 包含表示例 1

结构:

ID NUMBER ==> PRIMARY KEY
NAME VARCHAR ==> PRIMARY KEY
LASTNAME VARCHAR ==> NORMAL COLUMN

现在 SCHEMA1 SAMPLE1 包含以下数据

1) 123 'TEMP' 'TEMPOARY1'
2) 234 'TEMP2' 'TEMPORARY2'
3) 345 'TEMP3' 'TEMPORARY3'

SCHEMA2 SAMPLE1 包含以下数据

1) 123 'TEMP' 'TEMP1'
2) 23   'TEMP23 'TEMP2'
3) 235 'TEMP2' 'TEMP3'

现在我的目标是我需要将 SCHEMA1 的 SAMPLE1 表与 SCHEMA2 的 SAMPLE1 表同步,结果应该如下。

1) 123 'TEMP' 'TEMP1'
2) 234 'TEMP2' 'TEMPORARY2'
3) 345 'TEMP3' 'TEMPORARY3'

感谢您的帮助

【问题讨论】:

  • 使用MERGE 声明。看我的回答。

标签: oracle oracle11g sql-update


【解决方案1】:

试试这样的:

 declare

   procedure fncUpdate(pId PLS_INTEGER, pName VARCHAR2 , pLastname VARCHAR2) as
   vIden pls_integer;    
   begin
     UPDATE SCHEMA2.SAMPLE1 set  id, name,lastname  values (pId, pName pLastname)
     returning iden into vIden;

     DBMS_OUTPUT.PUT_LINE('iden : '|| vIden);      
   end fncUpdate;

 begin
    for cur in(
        SELECT id,name,lastname
        FROM  SCHEMA1.SAMPLE1    
      ) 
      loop
        fncUpdate(cur.id,cur.name,cur.lastname);
      end loop;
 end;

【讨论】:

  • 为什么选择 PL/SQL?当您可以在 SQL 中执行时,切勿在 PL/SQL 中执行此操作。看我的回答。
【解决方案2】:

更新不同oracle数据库

上的两个相同表

我有两个架构

我已编辑您的问题标题并将数据库更改为架构。因为,您已经在问题正文中明确提到了架构。不要混淆 DATABASESCHEMA。我见过 SQL Server 开发人员经常将模式解释为数据库的相对术语。 架构是属于用户的一组对象(表、视图、索引等)。不要混淆架构和数据库。

不需要 PL/SQL。用普通的 SQL 来做。

您可以使用 MERGE 语句。

例如,

合并到 schema2.table2 t2 使用 (SELECT * FROM schema1.table1) t1 开(t2.primarykey = t1.key) 当匹配然后 更新集 t2.column2 = t1.column2 AND t2.column3 = t1.column3 /

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多