关于跨库调用的一个小测试

问题:

有A、B、C三个库
B库上的对象PROCEDURE b_test跨库调用A库上的对象TABLE a_test;
然而C库上的对象PROCEDURE c_test又调用B库上的b_test?
这样会出现什么问题?
能不能这样用?
能这样用的话效率如何?
可能出现的问题?

A库上的表:
CREATE TABLE EDU.A_TEST
(
    ID NUMBER     NULL
)

B库上的对象:
CREATE OR REPLACE PROCEDURE EDU."B_TEST"(num in number,site in varchar2)
AS
V_ERR_CODE NUMBER;
V_ERR_TXT   VARCHAR2(400);
b_time TIMESTAMP(6);
e_time  TIMESTAMP(6);
BEGIN
  select sysdate into b_time from dual;
 
  FOR I IN 1..num LOOP
  INSERT INTO a_test@B_TO_A
  VALUES(i);
  END LOOP;
  commit;
 
  select sysdate into e_time from dual;
  commit;
 
  insert into proc_use_times
  values('B_TEST',site||num,b_time,e_time);
  commit;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    V_ERR_CODE:=SQLCODE;
    V_ERR_TXT:=SQLERRM;
    INSERT INTO PROC_ERR_LOGS  VALUES(
            V_ERR_CODE,
            V_ERR_TXT,
            SYSDATE,
            'EXCEPTION'
         );
         COMMIT;
END ;

SQL> set timing on
SQL> begin
  2  B_TEST(100,'db_b');
  3  end;
  4  /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.18 100

总结

已用时间:  00: 00: 00.18 100B
已用时间:  00: 00: 00.21 1000B
已用时间:  00: 00: 01.81 10000B
已用时间:  00: 00: 17.93 100000B
已用时间:  00: 03: 18.60 1000000B 

已用时间:  00: 00: 00.39 100C
已用时间:  00: 00: 00.21 1000C
已用时间:  00: 00: 02.07 10000C
已用时间:  00: 00: 19.48 100000C
已用时间:  00: 03: 13.82 1000000C


已用时间:  00: 00: 00.07 100B
已用时间:  00: 00: 00.21 1000B
已用时间:  00: 00: 01.76 10000B
已用时间:  00: 00: 19.84 100000B
已用时间:  00: 03: 13.15 1000000B


已用时间:  00: 00: 00.14 100C
已用时间:  00: 00: 00.25 1000C
已用时间:  00: 00: 01.95 10000C
已用时间:  00: 00: 18.82 100000C
已用时间:  00: 03: 11.25 1000000C

这个结果比较奇怪,不晓得是不是中间truncate表的缘故而影响了测试结果
①可能会存在一定的效率问题
②C库对象在execute时候容易出错,尤其是动了A库的表之后,因此最好不要这样用。

原文地址:https://www.cnblogs.com/gracejiang/p/5890441.html