在oracle sql developer中从另一个数据库的视图更新表列

在oracle sql developer中从另一个数据库的视图更新表列,sql,oracle,Sql,Oracle,我在oracle中有2个数据库 DATABASE TABLE/VIEW NAME digidb1 CUSTOMER_REFERENCE digidb2 CUST_REF_VIEW 此查询将显示来自db digidb1的表CUSTOMER_REFERENCE中的所有数据 select * from CUSTOMER_REFERENCE cust_id brch_code cust_name descri

我在oracle中有2个数据库

DATABASE           TABLE/VIEW NAME

digidb1          CUSTOMER_REFERENCE

digidb2           CUST_REF_VIEW
此查询将显示来自db digidb1的表CUSTOMER_REFERENCE中的所有数据

select * from CUSTOMER_REFERENCE

cust_id    brch_code     cust_name         description
001        001           COMPANY TEST 1    TEST COMPANY 1
002        002           COMPANY TEST 2    TEST COMPANY 2
003        003           COMPANY TEST 3    TEST COMPANY 3
此查询将显示来自db digidb2的视图CUST_REF_视图中的所有数据

select * FROM CUST_REF_VIEW

WINBBN      CUSTFULLNAME       ISINDIVIDUAL         MRGDATE
1234        COMPANY TEST 1        N                 12-03-20
4567        COMPANY TEST 4        N                 12-03-20
8901        COMPANY TEST 2        N                 11-03-20
2345        COMPANY TEST 5        Y                 10-03-20
6789        COMPANY TEST 3        N                 12-03-20
是否可以使用此数据从数据库(digidb1)更新表(CUSTOMER_REFERENCE)? 我想从digidb1更新CUSTOMER_引用中的cust_id列。数据将来自digidb2的视图CUST_REF_

更新的条件是:

  • CUSTFULLNAME等于cust_name

  • MRGDATE等于系统日期/今天(12-03-20)

  • ISINDIVIDUAL等于N

  • 我的预期结果是:

    cust_id    brch_code      cust_name         description
    1234       001           COMPANY TEST 1    TEST COMPANY 1
    002        002           COMPANY TEST 2    TEST COMPANY 2
    6789       003           COMPANY TEST 3    TEST COMPANY 3
    

    如果我理解正确的话,您实际上并不想更新任何内容,而是通过使用特定条件将这两个视图合并来从中选择数据。如果是这样,那么:

    SQL> with
      2  -- sample data
      3  customer_reference (cust_id, brch_code, cust_name, description) as
      4    (select '001', '001', 'CT1', 'TC1' from dual union all
      5     select '002', '002', 'CT2', 'TC2' from dual union all
      6     select '003', '003', 'CT3', 'TC3' from dual
      7    ),
      8  cust_ref_view (winbbn, custfullname, isindividual, mgrdate) as
      9    (select '1234', 'CT1', 'N', date '2020-03-12' from dual union all
     10     select '4567', 'CT4', 'N', date '2020-03-12' from dual union all
     11     select '8901', 'CT2', 'N', date '2020-03-11' from dual union all
     12     select '2345', 'CT5', 'Y', date '2020-03-10' from dual union all
     13     select '6789', 'CT3', 'N', date '2020-03-12' from dual
     14    )
     15  -- query you need
     16  select case when     v.mgrdate = trunc(sysdate)
     17                   and v.isindividual = 'N'
     18                   then v.winbbn
     19              else r.cust_id
     20         end cust_id,
     21         --
     22         r.brch_code, r.cust_name, r.description
     23  from customer_reference r join cust_ref_view v on v.custfullname = r.cust_name;
    
    CUST BRC CUS DES
    ---- --- --- ---
    1234 001 CT1 TC1
    002  002 CT2 TC2
    6789 003 CT3 TC3
    
    SQL>
    
    现在,根据您真正称之为“数据库”的内容,如果这些数据库确实是不同的数据库,则可能会涉及到数据库链接

    from customer_reference r join cust_ref_view@db_link_digidb2 v
                                                ----------------
                                                this 
    
    如果同一数据库中的用户(模式)几乎不同,那么您需要从一个用户向另一个用户授予(至少)
    选择
    权限。这还意味着您需要在远程视图名称之前加上其所有者名称,例如

    from customer_reference r join digidb2.cust_ref_view v
                                   --------
                                   this 
    

    或者-一个更简单的选项-在一个模式中创建一个同义词,该同义词将指向另一个模式中的视图。在这种情况下,我发布的查询中的第23行看起来完全一样。

    在Oracle中,您只能更新可更新的视图。更准确地说,每个视图都有可更新和不可更新的列。您可以在字典中检查要更新的列是否可更新。对不起。我编辑了我的帖子。我把结果弄乱了。应该是另一种方式,我真的需要从数据库digidb1.OK更新表CUSTOMER\u REFERENCE的cust\u id列;只需重写选择以更新。