【问题标题】:Copy nested table's values in another tuple of same table将嵌套表的值复制到同一张表的另一个元组中
【发布时间】:2018-09-02 02:00:42
【问题描述】:

我在 oracle 11g 中有一个名为 parlamentari 的表格:

cf varchar(16) 名称 varchar(20) 认知 varchar(20) telefoni telefoni_NT

其中 telefoni_NT 是 varchar2 的嵌套表。 现在,我必须将一个元组 (sorgente) 的嵌套表的元素复制到另一个元组 (ricevente) 中。 我试着写一个例子

开始情况

parlamentari
-------------------------------------
cf | nome | cognome | telefoni 
-------------------------------------
 1 |   a  |    aa   |  VARCHAR(222,444)
 2 |   b  |    bb   |  VARCHAR(111)

程序调用后的情况

parlamentari
-------------------------------------
cf | nome | cognome | telefoni 
-------------------------------------
 1 |   a  |    aa   |  VARCHAR(222,444)
 2 |   b  |    bb   |  VARCHAR(111, 222, 444)

我试图写这个程序没有成功

create or replace procedure copia_telefoni2
(sorgente in parlamento2018.parlamentari.cf%type,
 ricevente in parlamento2018.parlamentari.cf%type) as

cursor cur_out_tel is 
  select column_value as original_list 
  from parlamentari, table(telefoni)
  where cf = sorgente
 ;

cursor in_parlamentare is 
  select column_value as copied_list 
  from parlamentari, table(telefoni)
  where cf = destinazione;

begin

  if (sorgente <> destinazione) then

    for i in cur_out_tel loop
      dbms_output.put_line(i.original_list);

          insert into table(select telefoni from parlamentari where cf=destinazione) values (telefoni_nt(i.original_list));

    end loop;
  else
    dbms_output.put_line('Errore! Sorgente e destinazione uguali');
  end if;

end copia_telefoni2;

【问题讨论】:

    标签: oracle11g nested


    【解决方案1】:

    将嵌套表的值复制到同一张表的另一个元组中

    据我所知,您不需要在table 中输入insert,因为该记录已存在于您的表中。您只需要更新现有记录即可。由于您的表格列是nested 表格,因此MULTISET UNION 适合您的情况。请看下面的演示:

    表格:

    CREATE OR REPLACE TYPE telefoni_nt IS TABLE OF VARCHAR2(100);
    
    CREATE TABLE parlamentari (
        cf         VARCHAR(16),
        nome       VARCHAR(20),
        cognome    VARCHAR(20),
        telefoni   telefoni_nt
    )
    NESTED TABLE telefoni STORE AS nested_telefoni;
    
    insert into parlamentari values('1','a','aa',telefoni_nt('VARCHAR(222,444)'));
    
    insert into parlamentari values('2','b','bb',telefoni_nt('VARCHAR(111)'));
    

    输出:

    SQL> Select CF ,TELEFONI from parlamentari;
    
            CF           TELEFONI
            --           ------
            1            TELEFONI_NT('VARCHAR(222,444)')
            2            TELEFONI_NT('VARCHAR(111)')
    

    程序:

    CREATE OR REPLACE PROCEDURE copia_telefoni2 (
        sorgente       IN parlamentari.cf%TYPE,
        destinazione   IN parlamentari.cf%TYPE
    ) AS
    
    BEGIN
        IF ( sorgente <> destinazione )        
        THEN    
                --Using MULTISET Operator to merge the destination column element with the source column elements.
                UPDATE parlamentari
                    SET
                        telefoni = telefoni MULTISET UNION (SELECT telefoni 
                                                            FROM parlamentari 
                                                            WHERE cf = sorgente )
                WHERE
                    cf = destinazione;
        ELSE
            dbms_output.put_line('Errore! Sorgente e destinazione uguali');
        END IF;
    COMMIT;
    END copia_telefoni2;
    /
    

    执行:

    SQL> EXEC copia_telefoni2('1','2');
    
     PL/SQL procedure successfully completed.
    

    结果:

    SQL> Select CF ,TELEFONI from parlamentari;
    
                CF           TELEFONI
                --           ------
                1            TELEFONI_NT('VARCHAR(222,444)')
                2            TELEFONI_NT('VARCHAR(111)','VARCHAR(222,444)')
    

    所以你可以在结果中看到两行现在已经合并了。

    【讨论】:

    • 感谢您的解决方案。我对这个问题还有另一个问题。如果我想使用强制转换运算符(我知道这个运算符是谁不推荐使用的)?
    • Cast 将抛出错误或不一致的数据类型,因为您尝试更新列而不是集合。
    • 但是 Telefoni 可以被认为是一个集合吗?
    • 是的,它是一个集合,但在这种情况下它只是不起作用。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2022-01-23
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多