ITPub博客

首页 > 数据库 > 数据库开发技术 > 在远端和本地存储过程间传递数组[zt]

在远端和本地存储过程间传递数组[zt]

原创 数据库开发技术 作者:xsb 时间:2007-10-19 13:18:36 0 删除 编辑

对于本地的存储过程直接,直接传递数组是很容易的.对于远端存储过程,即使传递完全相同的集合数据类型,也是会报错的,这是由于变量的定义在本地,Oracle无法确定本地变量和远端变量是相同的。对于这种情况,可以利用远端类型来进行变量的声明:DECLARE
V_NAME PA_TEST.T_NAME@YTK102.YTK_THINKPAD;
BEGIN
...

[@more@]

Ref: http://yangtingkun.itpub.net/post/468/405146

简单描述一下在远端存储过程和本地存储过程之间传递数组的方法。

对于本地的存储过程直接,直接传递数组是很容易的:

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/12402/viewspace-977560/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    66
  • 访问量
    3083032