【问题标题】:ORA-01779 canon modify a column which maps to a non key-preserved table [closed]ORA-01779 canon 修改映射到非键保留表的列 [关闭]
【发布时间】:2013-06-06 09:33:40
【问题描述】:
create or replace view cv_vallist_all as
select
  S.BRN_ID,
  S.CODE,
  S.CONSTVAL,
  S.GENMODE,
  S.CONSTCODE,
  substr (nvl(L.SHORTNAME,S.SHORTNAME), 1, 10) as SHORTNAME,
  S.ARCFL,
  substr (nvl(L.NAME,S.NAME), 1, 30) as NAME,
  substr (nvl(L.PRIM,S.PRIM), 1, 250) as PRIM,
  substr (nvl(L.LONGNAME,S.LONGNAME), 1, 250) as LONGNAME,
  S.TXT_ADD
from C_VALLIST_LNG L,
     C_VALLIST_STD S
where L.LNG_ID(+) = P_Lng
  and L.BRN_ID(+) = S.BRN_ID
  and L.CODE(+) = S.CODE
  and L.CONSTVAL(+) = S.CONSTVAL;
comment on column CV_VALLIST_ALL.CODE is 'CODE';
comment on column CV_VALLIST_ALL.CONSTVAL is 'CONSTVAL';
comment on column CV_VALLIST_ALL.GENMODE is 'GENMODE';
comment on column CV_VALLIST_ALL.CONSTCODE is 'CONSTCODE';
comment on column CV_VALLIST_ALL.SHORTNAME is 'SHORTNAME';
comment on column CV_VALLIST_ALL.ARCFL is 'ARCFL';
comment on column CV_VALLIST_ALL.NAME is 'NAME';
comment on column CV_VALLIST_ALL.PRIM is 'PRIM';
comment on column CV_VALLIST_ALL.LONGNAME is 'LONGNAME';
comment on column CV_VALLIST_ALL.TXT_ADD is 'TXT_ADD';
insert into CV_VALLIST_ALL
  (CODE, CONSTVAL, BRN_ID, GENMODE, CONSTCODE, SHORTNAME, ARCFL, NAME, PRIM, LONGNAME, TXT_ADD)
values
  ('N_FRM_REF', 't', 21, 'n', '', 'T', 0, 't', '', 't', '')

【问题讨论】:

  • 您使用的是哪个版本的 Oracle?为什么不使用LEFT JOIN 而不是旧的(+) 外连接语法?
  • 你想做什么?用一个语句插入 2 个表?

标签: sql oracle insert insert-update


【解决方案1】:

列 SHORTNAME 在您的视图中定义为 substr (nvl(L.SHORTNAME,S.SHORTNAME), 1, 10)。显然,您不能简单地将值插入该列。同样其他列也不适合简单的插入。

您可以在视图上定义一个 INSTEAD OF 触发器,以对表 C_VALLIST_STD 和 C_VALLIST_LNG 执行所需的插入操作。

【讨论】:

    【解决方案2】:
    CREATE TABLE tab1(id NUMBER, col1 NUMBER);
    -- table TAB1 created.
    CREATE TABLE tab2(id NUMBER, col1 NUMBER, col2 NUMBER, col3 NUMBER);
    -- table TAB2 created.
    
    INSERT  ALL
    INTO tab1(id, col1)             VALUES (tab1_id, tab1_col1)
    INTO tab2(id, col1, col2, col3) VALUES (tab2_id, tab2_col1, tab2_col2, tab2_col3)
    SELECT  1  AS tab1_id
    ,       11 AS tab1_col1
    ,       1  AS tab2_id
    ,       21 AS tab2_col1
    ,       22 AS tab2_col2
    ,       23 AS tab2_col3
    FROM    DUAL
    ;
    -- 2 rows inserted.
    
    SELECT * FROM tab1;
    -- 1    11
    
    SELECT * FROM tab2;
    -- 1    21  22  23
    
    CREATE  VIEW tab_vw AS
    SELECT  tab1.id   AS tab1_id
    ,       tab1.col1 AS tab1_col1
    ,       tab2.id   AS tab2_id
    ,       tab2.col1 AS tab2_col1
    ,       tab2.col2 AS tab2_col2
    ,       tab2.col3 AS tab2_col3
    FROM    tab1
    JOIN    tab2
    ON      tab1.id = tab2.id
    ;
    -- view TAB_VW created.
    
    SELECT * FROM tab_vw;
    -- 1    11  1   21  22  23
    
    CREATE OR REPLACE TRIGGER tab_trg
    INSTEAD OF INSERT ON tab_vw
    FOR EACH ROW
    BEGIN
        INSERT INTO tab1(id, col1)             VALUES (:new.tab1_id, :new.tab1_col1);
        INSERT INTO tab2(id, col1, col2, col3) VALUES (:new.tab2_id, :new.tab2_col1, :new.tab2_col2, :new.tab2_col3);
    END;
    -- TRIGGER TAB_TRG compiled
    
    INSERT  INTO tab_vw
    (
            tab1_id
    ,       tab1_col1
    ,       tab2_id
    ,       tab2_col1
    ,       tab2_col2
    ,       tab2_col3
    )
    SELECT  2  AS tab1_id
    ,       11 AS tab1_col1
    ,       2  AS tab2_id
    ,       21 AS tab2_col1
    ,       22 AS tab2_col2
    ,       23 AS tab2_col3
    FROM    DUAL
    ;
    -- 1 rows inserted.
    
    SELECT  *
    FROM    tab_vw;
    -- 1    11  1   21  22  23
    -- 2    11  2   21  22  23
    

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-06-19
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多