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

Oracle PL/SQLの変数に複数の列を持つマイナスクエリの結果を格納する

    SYS.ODCINUMBERLIST 各レコードに単一の番号がある単なるリストです。各行に複数のフィールドを格納するには、新しいレコードタイプを使用する必要があります。

    SYS.ODCINUMBERLISTの代わりに使用するレコードタイプを定義できます。 。しかし、私はSELECTを動かしたいと思います ステートメントを明示的なカーソルにすることで、新しいタイプをカーソル%ROWTYPEとして定義できます。 。そうすれば、レコードタイプとselectステートメントは常に一貫していますが、コードの構造が少し変わります。

    そのアプローチは次のとおりです。

    DECLARE 
    
      CURSOR c_select IS
          SELECT project_id, project_name
          FROM 
            (
              SELECT t1.project_id, t1.project_name FROM table_one t1
              MINUS
              SELECT t2.project_id, t2.project_name FROM table_two t2 );
    
      TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
      l_missing_row_list l_missing_row_list_typ;
      
    BEGIN
      OPEN c_select;
      FETCH c_select BULK COLLECT INTO l_missing_row_list;
      CLOSE c_select;
      
      FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
        INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
        
      COMMIT;
      
      -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
    END;
    

    BULK COLLECTに関する1つのメモ (ここと元の投稿の両方)-一括収集しているデータはPGAメモリに保存されます。したがって、変更があった場合は、このコードをそのまま使用しないでください。新しいレコードの数は不合理になります(おそらく数千を超える)。




    1. IN句で指定されたすべての値に一致する行のみを選択する

    2. Oracle Date TO_CHAR('Month DD、YYYY')に余分なスペースがあります

    3. MySQLの2つの異なるテーブルで類似の行を選択するにはどうすればよいですか(可能ですか?)

    4. MySQLはmysqlの結果を再フォーマットしてjsonhansontableに適合させます