首页 > Linux操作系统 > Linux操作系统 > 在远端和本地存储过程间传递数组
简单描述一下在远端存储过程和本地存储过程之间传递数组的方法。
对于本地的存储过程直接,直接传递数组是很容易的:
SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
2 TYPE T_NAME IS TABLE OF VARCHAR2(30);
3 END;
4 /
程序包已创建。
SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_NAME OUT PA_TEST.T_NAME) AS
2 BEGIN
3 SELECT TABLE_NAME BULK COLLECT INTO P_NAME FROM USER_TABLES;
4 END;
5 /
过程已创建。
SQL> SET SERVEROUT ON SIZE 1000000
SQL> DECLARE
2 V_NAME PA_TEST.T_NAME;
3 BEGIN
4 P_TEST(V_NAME);
5 FOR I IN 1..V_NAME.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_NAME(I));
7 END LOOP;
8 END;
9 /
T_BLOB
T
T_PK
MLOG$_T
MLOG$_T_BLOB
MLOG$_T_PK
T2
RUPD$_T_PK
PL/SQL 过程已成功完成。
不过同样的方法并不适应于远端存储过程调用:
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
------------------------------------------------
YTK102.YTK_THINKPAD
SQL> CONN YANGTK/YANGTK@TEST1已连接。
SQL> CREATE DATABASE LINK YTK102.YTK_THINKPAD CONNECT TO YANGTK IDENTIFIED BY YANGTK USING 'YTK102';
数据库链接已创建。
SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
2 TYPE T_NAME IS TABLE OF VARCHAR2(30);
3 END;
4 /
程序包已创建。
SQL> SET SERVEROUT ON SIZE 1000000
SQL> DECLARE
2 V_NAME PA_TEST.T_NAME;
3 BEGIN
4 P_TEST@YTK102.YTK_THINKPAD(V_NAME);
5 FOR I IN 1..V_NAME.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_NAME(I));
7 END LOOP;
8 END;
9 /
P_TEST@YTK102.YTK_THINKPAD(V_NAME);
*第 4 行出现错误:
ORA-06550: 第 4 行, 第 2 列:
PLS-00306: 调用 'P_TEST' 时参数个数或类型错误
ORA-06550: 第 4 行, 第 2 列:
PL/SQL: Statement ignored
对于远端存储过程,即使传递完全相同的集合数据类型,也是会报错的,这是由于变量的定义在本地,Oracle无法确定本地变量和远端变量是相同的。
对于这种情况,可以利用远端类型来进行变量的声明:
SQL> DECLARE
2 V_NAME PA_TEST.T_NAME@YTK102.YTK_THINKPAD;
3 BEGIN
4 P_TEST@YTK102.YTK_THINKPAD(V_NAME);
5 FOR I IN 1..V_NAME.COUNT LOOP
6 DBMS_OUTPUT.PUT_LINE(V_NAME(I));
7 END LOOP;
8 END;
9 /
T_BLOB
T
T_PK
MLOG$_T
MLOG$_T_BLOB
MLOG$_T_PK
T2
RUPD$_T_PK
PL/SQL 过程已成功完成。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69457/,如需转载,请注明出处,否则将追究法律责任。