3

SELECTステートメントからレコードがテーブルに存在するかどうかを確認する必要があります。レコードが存在する場合は更新を行い、そうでない場合はテーブルにレコードを作成します。しようとしていますが、PLS-00103エラーが発生します。

これらは、DBVisaulzierでコードを実行したときに発生するエラーです。

18:00:09  [DECLARE - 0 row(s), 0.000 secs]  [Error Code: 6550, SQL State: 65000]  ORA-06550: line 2, column 12:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

:= . ( @ % ; not null range default character
18:00:09  [BEGIN - 0 row(s), 0.000 secs]  [Error Code: 6550, SQL State: 65000]  
ORA-06550: line 2, column 97:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

;
18:00:09  [IF - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
18:00:09  [ELSE - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]   
ORA-00900: invalid SQL statement
18:00:09  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
18:00:09  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
... 6 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 6 errors]

以下は私のコードです:

DECLARE a NUMBER;

BEGIN

  SELECT 1 
    INTO a 
    FROM FREC_EMAIL t
   WHERE t.FranchiseNo = '208254846' 
     AND t.ReportID = 1 
     AND t.id = 165;

  IF a=1 THEN

       UPDATE FREC_EMAIL
          SET email = 'blah@foo.com'
        WHERE FranchiseNo = '208254846' 
          AND ReportID = 1 
          AND ID = 165;

    ELSE

        INSERT INTO FREC_EMAIL
          (FranchiseNo, Email, ReportID)
         VALUES
           ('208254846', 'blah@foo.com', 1);

    END IF;
END;
4

5 に答える 5

9

可能な限り常に SQL を使用し、厳密に必要な場合を除き、Pl/SQL の使用は避けてください。SQL ステートメントはより高速に実行され、通常はタイピングが少なくて済み、より簡単に正しく実行できます。

9i Oracle では、"upsert" ステートメントを実行する単一の SQL ステートメントである MERGE が提供されています。

MERGE INTO frec_email t
USING (SELECT  'blah@foo.com' as email
                ,  '208254846' as FranchiseNo
                , 1 as ReportID
                , 165 as ID 
       FROM dual ) s
ON (s.ID = t.ID)
WHEN MATCHED THEN
     UPDATE SET t.email = s.email
WHEN NOT MATCHED THEN
    INSERT (t.FranchiseNo, t.Email, t.ReportID)
    VALUES  (s.FranchiseNo, s.Email, s.ReportID)
/
于 2009-09-23T05:03:40.257 に答える
0

pl / sqlブロックでは、次のことができます。

テーブルセットの更新column=.... where .....;

SQL%ROWCOUNT = 0の場合、挿入...... END IF;

K

于 2009-09-22T23:14:29.623 に答える
0

余談ですが、Oracle を初めて使用する場合は、時間をかけて公式ドキュメントを理解することをお勧めします。どこから始めればよいかわかりにくいかもしれませんが、Tom Kyte のRoad Mapは必読のリストを得るのに適した場所です。

幸運を!

于 2009-09-23T07:18:45.493 に答える
0

私は通常、次の概念を使用します。これは、マージよりも読みやすいと思います::

BEGIN

  UPDATE FREC_EMAIL
     SET email = 'blah@foo.com'
   WHERE FranchiseNo = '208254846' 
     AND ReportID = 1 
     AND ID = 165;

  IF SQL%NOTFOUND THEN
    INSERT INTO FREC_EMAIL
          (FranchiseNo, Email, ReportID, ID)
      VALUES
          ('208254846', 'blah@foo.com', 1, 165);
  END IF;

END;
于 2010-11-16T16:13:16.957 に答える
0

MERGE コマンドを使用します (アップサートとも呼ばれます)。オラクルのリファレンス(例付き)はこちら.

于 2009-09-23T01:53:11.243 に答える