procedure xxx
begin
  A(); // 对表T1进行更新的一个procedure
  B(); // 对表T2进行更新的一个procedure
  ret = C();  // 通过表T1 T2更新后的状态,返回一个值, C是一个function
end xxx;全程没有commit,在同一个事务里
正式环境是多台服务器, C() 这个函数还是通过T1 T2老的数据状态计算的
开发环境是一台服务器,是通过最新的计算的。函数C 和 T1 T2 没有同一个schema下按道理开发服务器是对的。可能是多台服务器的缘故?希望各位大侠帮忙看看

解决方案 »

  1.   

    1.什么是多台服务器?是多个Oracle实例?还是一个Oracle实例,多个Scheam?
    2.如果是同一个事务,执行完A()和B()之后,虽然没有Commit,但是C()应该读的是T1,T2的新数据了。
    除非是T1,T2存在于不同的Scheam下,而且数据不是同步的。
    3.这里执行的存储过程XXX,是通过什么应该程序调用的?肯定不是手动执行的吧?
      

  2.   

    1. 硬件上正式环境就是三台服务器,同时也是多个oracle实例
    2. t1, t2 在同一个schema下, 函数c在另外一个schema子
    3. 其他应用程序调用和在sqlplus中手动调用结果都是一样的。
      

  3.   

    开发环境和正式环境都一样,就是服务器的台数不一样。开发是一台。oracle 实例什么的都是一样的。
      

  4.   


    SQL> create table t(a varchar2(10),b varchar2(10));
     
    Table created
    SQL> insert into t values ('1','1');
     
    1 row inserted
    SQL> commit;
     
    Commit complete
    SQL> create or replace procedure pro_a
      2  as
      3  begin
      4    update t set b='2' where a='1';
      5  end;
      6  /
     
    Procedure created
    SQL> create or replace procedure pro_b
      2  as
      3  begin
      4    update t set b='3' where a='1';
      5  end;
      6  /
     
    Procedure created
    SQL> create or replace function f return varchar2
      2  as
      3  v_b  t.b%type;
      4  begin
      5    select b into v_b from t where a='1';
      6    return v_b;
      7  end;
      8  /
     
    Function created
    SQL> create or replace procedure pro_test
      2  as
      3  v_b t.b%type;
      4  begin
      5    pro_a;
      6    v_b:= f;
      7    dbms_output.put_line('v_b:='||v_b);
      8    pro_b;
      9    v_b:= f;
     10    dbms_output.put_line('v_b:='||v_b);
     11  end;
     12  /
     
    Procedure created
    SQL> set serveroutput on;
    SQL> exec pro_test;
     
    v_b:=2
    v_b:=3
     
    PL/SQL procedure successfully completed
     
    SQL> 
      

  5.   


    开发一台服务器的时候是没问题,取到的是最新数据。
    正式环境三台的话就不对了。我一直怀疑是不是三台服务器没有及时同步?还是function用到了回滚段里的数据?