1

これは私が今まで持っているものです

BEGIN
             UPDATE t1
                set t1.LANGUAGE_ID = (case NETWORK.NID
                        when 11 then 10
                        else 7
                        end)
                FROM PROFILE, NETWORK where
                PROFILE.STATUS in ('A','U','S','H','I')
                AND PROFILE.MID = t1.MID
                AND NETWORK.MID = t1.MID
                AND t1.IS_DELETED = 'N'
END;

エラーの取得:

"ORA-06550: line 7, column 21:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 2, column 18:
PL/SQL: SQL Statement ignored
ORA-06550: line 12, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   ( begin case declare end exception exit for goto if loop mod
   null pragma raise return select update while with
   <an identifier> <a double-quoted"

t1.is_deleted ='N'のときにt1を更新したいのですが、プロファイルの同じmidのステータスがAUSHIです。すべてのテーブルには中央列があります。このエラーが発生する理由はありますか?

4

2 に答える 2

1

Oracleでは、ステートメントに句UPDATEがありません。FROM

相関更新が必要なようです

UPDATE t1
   SET t1.language_id = (SELECT (CASE WHEN network.nid = 11 
                                      THEN 10
                                      ELSE 7
                                  END)
                           FROM profile,
                                network
                          WHERE profile.status IN ('A','U','S','H','I')
                            AND profile.mid = t1.mid
                            AND network.mid = t1.mid
                            AND t1.is_deleted = 'N');

これにより、t1設定のすべての行が、相関サブクエリが行を返さない場合に更新されます。サブクエリによって返された一致する行がある場所の行のみを更新する場合language_idNULLt1

UPDATE t1
   SET t1.language_id = (SELECT (CASE WHEN network.nid = 11 
                                      THEN 10
                                      ELSE 7
                                  END)
                           FROM profile,
                                network
                          WHERE profile.status IN ('A','U','S','H','I')
                            AND profile.mid = t1.mid
                            AND network.mid = t1.mid
                            AND t1.is_deleted = 'N')
  WHERE EXISTS( SELECT 1
                  FROM profile,
                       network
                 WHERE profile.status IN ('A','U','S','H','I')
                   AND profile.mid = t1.mid
                   AND network.mid = t1.mid
                   AND t1.is_deleted = 'N');
于 2013-03-19T15:38:37.427 に答える
1

@Justinが提供するソリューションはうまく機能しますが、テーブルが大きい場合は、代わりにMERGEの使用を検討してください。提供されたクエリを使用して、テーブルの各行に対してネストされたSELECTクエリを1回実行しますt1

このリンクは非常に便利だと思いました:8つの一括更新方法の比較

于 2013-08-02T20:29:32.343 に答える