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

Oracleのカーソルを使用してレコードを挿入および更新します

    これは非常に非効率的な方法です。 mergeを使用できます ステートメントを作成すれば、カーソル、ループ、または(なしで実行できる場合は)PL/SQLは必要ありません。

    MERGE INTO studLoad l
    USING ( SELECT studId, studName FROM student ) s
    ON (l.studId = s.studId)
    WHEN MATCHED THEN
      UPDATE SET l.studName = s.studName
       WHERE l.studName != s.studName
    WHEN NOT MATCHED THEN 
    INSERT (l.studID, l.studName)
    VALUES (s.studId, s.studName)
    

    必ずcommitしてください 、完了したら、これをデータベースで確認できるようにします。

    実際にあなたの質問に答えるために、私はそれを次のようにします。これには、SQLでほとんどの作業を実行し、テーブル内の一意のアドレスであるROWIDに基づいてのみ更新するという利点があります。

    一度に10,000行のデータをまとめて配置するタイプを宣言します。次に、これらの行を個別に処理します。

    ただし、私が言うように、これはmergeほど効率的ではありません 。

    declare
    
       cursor c_data is
        select b.rowid as rid, a.studId, a.studName
          from student a
          left outer join studLoad b
            on a.studId = b.studId
           and a.studName <> b.studName
               ;
    
       type t__data is table of c_data%rowtype index by binary_integer;
       t_data t__data;
    
    begin
    
       open c_data;
       loop
          fetch c_data bulk collect into t_data limit 10000;
    
          exit when t_data.count = 0;
    
          for idx in t_data.first .. t_data.last loop
             if t_data(idx).rid is null then
                insert into studLoad (studId, studName)
                values (t_data(idx).studId, t_data(idx).studName);
             else
                update studLoad
                   set studName = t_data(idx).studName
                 where rowid = t_data(idx).rid
                       ;
             end if;
          end loop;
    
       end loop;
       close c_data;
    
    end;
    /
    


    1. postgres CLOSESTオペレーターはありますか?

    2. オフライン国際化アプリを作成する方法:Sqliteデータベースを使用する

    3. mysql_num_rows()は、パラメーター1がリソースであると想定しています。ブール値は次のように指定されます。

    4. インメモリOLTPデータベースとテーブルの作成とアクセス