0

.database を oracle 8 から oracle 11g に移行しました

update ステートメントの後のプロシージャの 1 つに、影響を受けた行があるかどうかをチェックする if 条件があります。はいの場合は何もしません。それ以外の場合は、データをテーブルに挿入します

IF (SQL%NOTFOUND) THEN
        -- The record does not exist so try to insert the master customer data.
        insert_order_master_customer(p_host_country_id,
                  p_order_id,             p_accting_year,
                  p_master_cust_id,
                  p_master_cust_name     );
    END IF;

しかし、この条件は、更新が成功した後は機能せず、true と評価され、制御が if ブロック内に入ります。

4

3 に答える 3

1

ここでは 11.2.0.2 では再現しません。

SQL> create table foo(id number);

Table created.

SQL> insert into foo values (1);

1 row created.

SQL> set serverout on
SQL> begin
  2    update foo set id = 2 where id = 1;
  3     IF (SQL%NOTFOUND) THEN
  4       dbms_output.put_line('not found!');
  5    elsif (SQL%NOTFOUND = false)
  6     then
  7       dbms_output.put_line('found!');
  8     end if;
  9  end;
 10  /
found!

更新はチェックの直前ですか、つまり、チェックの間に他に何もありませんか? dbms_output.put_line(sql%rowcount);また、IF チェックの直前に置くと、出力はどうなりますか?

于 2012-12-19T11:34:14.093 に答える
0
  1. 影響を受けた行数をカウントするには、SQL%ROWCOUNT を使用します。%NOTFOUND は、カーソルの Open-Fetch でのみ機能します。SQL%NOTFOUND は、WHEN NO_DATA_FOUND 例外内で TRUE になります。

  2. DATA_NOT_FOUND ではなく、NO_DATA_FOUND です。

于 2015-07-06T13:59:20.580 に答える
0
exception when DATA_NOT_FOUND then

insert_order_master_customer(p_host_country_id,
                      p_order_id,             p_accting_year,
                      p_master_cust_id,
                      p_master_cust_name     );
于 2012-12-19T11:27:05.993 に答える