本帖最后由 qingrou123 于 2011-11-14 17:03:01 编辑

解决方案 »

  1.   

    看起来是DBLink的问题, DBLink永远伤不起啊
      

  2.   

    dblink如果有问题的话,单独执行过程怎么会行的通?
      

  3.   

    不信你可以改下DBLink那句,这样估计就没问题了
    CREATE OR REPLACE PROCEDURE sp_tst_job_for_dblink
    AS
      cnt NUMBER;
      sss varchar2(400);
    BEGIN
      --SELECT COUNT(*) INTO cnt FROM test22@tst_db;
      cnt :=0;
      INSERT INTO test(slog1,slog2) VALUES(to_char(cnt),to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'==>sp_tst_job_for_dblink');
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
      sss:=SQLERRM;
      INSERT INTO test(slog1,slog2) VALUES(sss,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'==>sp_tst_job_for_dblink');
      COMMIT;
    END sp_tst_job_for_dblink;
      

  4.   

    直接赋值当然可以。现在的问题是,如果dblink有问题,为什么过程又能执行?难道job里有限制?能肯定的是job使用这个dblink才出错,但是原因又是什么?
      

  5.   

    你把test22@tst_db建个同义词先,在procedure中使用同义词看会有这个问题吗?
    create test22 for test22@tst_db;
    CREATE OR REPLACE PROCEDURE sp_tst_job_for_dblink
    AS
      cnt NUMBER;
      sss varchar2(400);
    BEGIN
      SELECT COUNT(*) INTO cnt FROM test22;
      INSERT INTO test(slog1,slog2) VALUES(to_char(cnt),to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'==>sp_tst_job_for_dblink');
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
      sss:=SQLERRM;
      INSERT INTO test(slog1,slog2) VALUES(sss,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'==>sp_tst_job_for_dblink');
      COMMIT;
    END sp_tst_job_for_dblink;
      

  6.   

    create synonym test22 for test22@tst_db;
      

  7.   

    oracle是10g的。现在用同义词测试可以了,但是现在问题又来了,在过程外面建同义词可以用,在过程里面动态创建同义词又不行,过程不报错,直接“PL/SQL procedure successfully completed.”,但是过程里面的插入语句没执行的。
    过程外创建同义词:
          CREATE SYNONYM SYN_TST FOR test22@tst_db;
    过程里动态创建同义词:
          SELECT COUNT(*) INTO cnt FROM user_synonyms WHERE synonym_name='SYN_TST';
         IF cnt=1 THEN
           EXECUTE IMMEDIATE 'DROP SYNONYM SYN_TST';
         END IF;
         EXECUTE IMMEDIATE 'CREATE SYNONYM SYN_TST FOR test22@tst_db';
    真的是莫名其妙啊
      

  8.   

    为什么在过程里面创建同义词,没有必要啊,你这样每次执行都要先drop再create.业务逻辑也没这样的.
    lz是在测试什么吗?
      

  9.   

    动态创建可以,是因为系统权限的问题,在过程里面create、drop之类的和在过程外不一样,给个CREATE ANY SYNONYM就可以通过了。现在剩下的问题就是为什么直接用dblink不行,用同义词就可以了