Oracle 11g sql%notfound问题

时间:2012-12-19 11:22:15

标签: oracle oracle11g

我们已将.database从oracle 8迁移到oracle 11g

在update语句之后的一个过程中有一个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;

但是这个条件在成功更新后无法正常工作,它正在评估为真,如果是阻止,则控制进入内部。

3 个答案:

答案 0 :(得分: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!

是检查前的更新,即它之间没有别的东西吗?如果你在IF检查之前放dbms_output.put_line(sql%rowcount);那么输出是什么?

答案 1 :(得分: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     );

答案 2 :(得分:0)

  1. 使用SQL%ROWCOUNT计算受影响的行数。 %NOTFOUND仅适用于Open-Fetch游标。 SQL%NOTFOUND在WHEN NO_DATA_FOUND异常中为TRUE。

  2. 是,NO_DATA_FOUND,不是DATA_NOT_FOUND