ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在远端和本地存储过程间传递数组

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

原创 Linux操作系统 作者:yangtingkun 时间:2007-10-13 00:00:00 0 删除 编辑

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


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

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

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10351273