Oracle 11g sql%未发现问题

Oracle 11g sql%未发现问题,oracle,oracle11g,Oracle,Oracle11g,我们已将.database从oracle 8迁移到oracle 11g 在其中一个过程after update语句中,有一个if条件,用于检查是否有任何行受到影响。 如果是,那么它将什么也不做,否则它将向表中插入数据 IF (SQL%NOTFOUND) THEN -- The record does not exist so try to insert the master customer data. insert_order_master_customer(p

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

在其中一个过程after 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;

但在成功更新后,此条件不起作用。它正在评估true,控件将进入if块。

在11.2.0.2上不会在此处重现

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     );
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\u output.put\u行(sql%rowcount)放入,则输出是什么就在IF检查之前

  • 使用SQL%ROWCOUNT计算受影响的行数。%NOTFOUND仅适用于Open Fetch游标。当未发现异常数据时,SQL%NOTFOUND将在内部为TRUE

  • 它是,找不到数据,找不到数据


  • SQL%notfound是否存在任何问题?它在oracle 8中工作正常是的,我们有一个更新语句。在我们提交之后,检查是否(SQL%NOTFOUND),然后插入命令end IF。在oracle 8中,它完全可以正常工作,即在更新后,它不在if条件内,但在迁移到11g后,即使在成功更新后,它也不工作。是的update语句就在检查之前。更新后,我们已编写提交;在这之后,dbms_output.put_行(sql%rowcount);是给零行。但是如果我写dbms_output.put_行(sql%rowcount);在提交之前,它给出了1行。@这就是为什么我说是在检查之前更新的原因。使用
    COMMIT在更新和sql%检查之间,我希望它为rowcount返回0,为notfound返回true。在执行任何其他sql之前,必须检查sql,包括
    commit当我独立执行时,更新sql是可以的,它的执行是正确的。您能告诉我在成功更新时,sql%retun number of Row updated of alwayz 0吗?@aru sql%rowcount将返回更新的行数。只有在完成提交或其他SQL操作之前捕获该值,它才会返回正确的值。@aru ie.do
    update x set a=。。。其中然后在任何提交之后、之前,比如
    v_rows:=sql%rowcount
    然后您就有了结果,可以提交或其他任何内容,然后您可以检查
    如果(v_rows>0),然后..
    (同样适用于
    sql%notfound
    ,只需保存到布尔变量)