问题:
有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库的表之后,因此最好不要这样用。