0

私は Oracle 11g とこのフォーラムの初心者です。私のSQL開発者は他の方法をとらないため、Oracle Mergeステートメントを使用して単純な更新ステートメントを実行するだけです。

奇妙なことに、どのようにステートメントを修正しようとしても、このフォーラムの多くのエントリを読んだ後でも、まったく同じエラー メッセージが表示されるのです。

SQL Developer でステートメントを実行する方法に応じて、2 つの異なるエラー メッセージがあります。ステートメントをストア プロシージャとして実行すると (更新ステートメントはストア プロシージャ内の小さな部分です。他の SQL ステートメントをコメント アウトし、この更新ステートメントをストアド プロシージャ内に残しました)、次のエラーが発生しました。

私はこれを実行しました:

create or replace
PROCEDURE ADDR_UPDATE_2
AS
/*     other sql statements are commented out    */  

MERGE INTO (SELECT id,xseq,line_1,line_2,zip,tax FROM ADDR ) b
USING (SELECT id,xseq,line_1, line_2,NVL(zip, '') AS pos_10 , NVL(tax, '') AS pos_11
     FROM TEMP_ADDR ) v
ON(b.id = v.id
  AND b.xseq = v.xseq)  
WHEN MATCHED THEN UPDATE SET b.line_1 = v.line_1,
                          b.line_2 = v.line_2,                            
                          b.zip = v.pos_10,
                          b.tax = v.pos_11
                          WHERE b.line_1 <> v.line_1  
                          OR b.line_2 <> v.line_2
                          OR b.zip <> v.pos_10; 

/*     other sql statements are commented out   */

END;

そして、私はこのエラーを受け取りました:

エラー (23,9): PLS-00103: 次のいずれかを予期しているときに、シンボル "INTO" が検出されました: 定数 例外 テーブル long double ref char 時間 タイムスタンプ 間隔 日付 バイナリ 各国文字 nchar

(私はどこでもゴーグルしましたが、答えは見つかりませんでした)

23行目は「INTO」という単語を参照しています

  • しかし、str の一部としてではなく、上記の Merge ステートメントを単独で実行した場合。プロシージャ、エラーは発生しません。結果が得られました: 0 行がマージされました。

ここで、Merge ステートメントを次のように変更しました。

create or replace
PROCEDURE ADDR_UPDATE_2
AS

/*  other sql statements are commented out  */  

MERGE INTO ADDR b
USING (SELECT id,xseq, line_1, line_2, NVL(zip, '') AS pos_10, 
            NVL(tax, '') AS pos_11 
     FROM TEMP_ADDR) v
 ON(b.id = v.id
    AND b.xseq = v.xseq
    AND b.line_1 <> v.line_1  
    OR b.line_2 <> v.line_2 
    OR  b.zip <> v.pos_10)  
 WHEN MATCHED THEN UPDATE SET b.line_1 = v.line_1,
                          b.line_2 = v.line_2,
                          b.zip = v.pos_10,
                          b.tax = v.pos_11;

 /*
   other sql statements are commented out
 */

END;

同じエラーが発生しました:

エラー (23,9): PLS-00103: 次のいずれかを予期しているときに、シンボル "INTO" が検出されました: 定数 例外 テーブル long double ref char 時間 タイムスタンプ 間隔 日付 バイナリ 各国文字 nchar

23行目は「INTO」という単語を参照しています

str の一部としてではなくステートメントを実行したとき。プロセス:

別のエラーが発生しました:

コマンド ラインのエラー:9 列:8
エラー レポート: SQL エラー: ORA-38104: ON 句で参照されている列を更新できません: "B"."LINE_2" 38104. 00000 - "ON 句で参照されている列を更新できません: %s" *原因: UPDATE SETのLHSに、ON句で参照されている列が含まれています *処置:

2 日前から答えを探してみましたが、結果が得られませんでした。この問題を解決する方法を教えてくれる人はいますか?

4

2 に答える 2

2

上記の質問で説明したように、「ON 句で参照されている列は更新できません」とは、ON 基準に含まれている場合、MATCHED 句の列を更新できないことを意味します。

MERGE を使用して、意図されていないことを実行しようとしているため、この立場にいます。今あなたは言う

「私の SQL 開発者はそれ以外の方法をとらないので、Oracle Merge ステートメントを使用して単純な更新ステートメントを実行するだけで済みます。」

フォード。正しい構文を取得していれば、SQL Developer が update ステートメントの実行を妨げることは絶対にありません。残念ながら、Oracle は (他の RDBMS とは異なり) DML ステートメントで ANSI 結合構文をサポートしておらず、Oracle 構文は直感的ではありません。

update
(
   select v.id
          , v.xseq
          , v.line_1
          , v.line_2
          , nvl(v.zip, '') AS pos_10
          , nvl(v.tax, '') AS pos_11
   from   addr b
         ,temp_addr v
   where  ( b.id = v.id
            and b.xseq = v.xseq )
      and ( b.line_1 <> v.line_1  
            or  b.line_2 <> v.line_2 
            or  b.zip <> v.pos_10)
     )
set b.line_1 = v.line_1,
    b.line_2 = v.line_2,
    b.zip = v.pos_10,
    b.tax = v.pos_11
;
于 2012-07-27T23:57:37.743 に答える
0

次の MERGE ステートメントは、少なくとも適切にコンパイルして実行する必要がありますが、ここで行うべき正しいことは UPDATE を使用することであるという @APC に同意します (それがあなたが実際にやろうとしていることだからです)。

MERGE INTO ADDR b
USING TEMP_ADDR v
  ON (b.id = v.id AND
      b.xseq = v.xseq)  
WHEN MATCHED THEN
  UPDATE
    SET b.line_1 = v.line_1,
        b.line_2 = v.line_2,                            
        b.zip = v.zip,
        b.tax = v.tax;

NVLOracle では長さ 0 の文字列 (たとえば ) は NULL と同じであるため、実行していた操作を削除しました''。そのため、NVL 呼び出しは、「このフィールドが NULL でない場合はそれを返します。それ以外の場合は NULL を返します」と言うのと同じでした。無意味の。

幸運を祈ります。

于 2015-05-21T16:53:41.927 に答える