sql >> データベース >  >> RDS >> Oracle

Oracleの複数のネストされたテーブルの複数のレコードを更新します

    おそらく、データベースでネストされたテーブルを回避する最も良い理由は、それらを操作するのが難しく、構文が文書化されておらず、理解するのが難しいことです。

    先に進みます!

    これは、ネストされたテーブルを持つテーブルです。

    SQL> select f.force_name, t.id, t.name
      2  from transformer_forces f, table(f.force_members) t
      3  /
    
    FORCE_NAME         ID NAME
    ---------- ---------- --------------------
    Autobot             0 Metroplex
    Autobot             0 Optimus Prime
    Autobot             0 Rodimus
    Decepticon          0 Galvatron
    Decepticon          0 Megatron
    Decepticon          0 Starscream
    Dinobot             0 Grimlock
    Dinobot             0 Swoop
    Dinobot             0 Snarl
    
    9 rows selected.
    
    SQL>
    

    ご覧のとおり、ネストされたテーブルのID属性の各要素は、すべての場合でゼロに設定されています。私たちがやりたいのは、それらすべてを更新することです。しかし、残念ながら!

    SQL> update table
      2   ( select force_members from transformer_forces ) t
      3  set t.id = rownum
      4  /
     ( select force_members from transformer_forces ) t
       *
    ERROR at line 2:
    ORA-01427: single-row subquery returns more than one row
    
    
    SQL> 
    

    ネストされたテーブルのすべての要素を、保持テーブルの1つの行に更新することができます。

    SQL> update table
      2       ( select force_members from transformer_forces
      3         where force_name = 'Autobot') t
      4      set t.id = rownum
      5  /
    
    3 rows updated.
    
    SQL>
    

    しかし、それを行う唯一の方法は テーブル全体がPL/SQLループです。うん!

    別の方法があります:ネストされたテーブルを使用するロケーター 、NESTED_TABLE_GET_REFSヒントを介して。これは特にあいまいなことです(ヒントのメインリスト )しかし、それはトリックを行います:

    SQL> update /*+ NESTED_TABLE_GET_REFS */ force_members_nt
      2  set id = rownum
      3  /
    
    9 rows updated.
    
    SQL> select f.force_name, t.id, t.name
      2  from transformer_forces f, table(f.force_members) t
      3  /
    
    FORCE_NAME         ID NAME
    ---------- ---------- --------------------
    Autobot             1 Metroplex
    Autobot             2 Optimus Prime
    Autobot             3 Rodimus
    Decepticon          4 Galvatron
    Decepticon          5 Megatron
    Decepticon          6 Starscream
    Dinobot             7 Grimlock
    Dinobot             8 Swoop
    Dinobot             9 Snarl
    
    9 rows selected.
    
    SQL>
    

    このヒントにより、保持テーブルを完全にバイパスして、実際のネストされたテーブルを操作できます。つまり、ネストされたテーブルのストレージ句で指定されたオブジェクト:

    create table transformer_forces (
        force_name varchar2(10)
        , force_members transformers_nt)
    nested table force_members store as force_members_nt return as value;
                                        ^^^^^^^^^^^^^^^^
    



    1. Oracleで2列のデータをA、B形式で取得する方法

    2. Python、PyQt、SQLiteでコンタクトブックを作成する

    3. MySQLデータベースへのMSSQLServerクレデンシャルの保存

    4. map_partitionsとpd.df.to_sqlを使用してdaskデータフレームからSQLテーブルを作成します