程序中需要调用这样一个存储过程,如果返回的都是varchar之类的很简单,执行成功了,现在有的存储过程中返回的包含varchar和记录集名称,我想测试下程序对不对,能不能帮我写个简单的我来测试下,谢谢了存储过程名称:GetAInfo
输入参数:
序号 字段名称 数据类型 字段说明 备注
1 inID VARCHAR

返回参数:
序号 字段名称 数据类型 字段说明 备注
1 AppCode VARCHAR 操作是否出错:1=成功;0=失败
2 ErrorMsg VARCHAR 操作出错提示信息
3 outRecCur Cursor 返回记录集名称

返回记录集字段定义:
序号 字段名称 数据类型 字段说明 备注
1 outID VARCHAR
2 outName VARCHAR
3 outRID VARCHAR
4 outRType VARCHAR
5 outRCount VARCHAR

解决方案 »

  1.   


    create table t_test(
      outID VARCHAR2(20),
      outName VARCHAR2(20),
      outRID VARCHAR2(20),
      outRType VARCHAR2(20), 
      outRCount VARCHAR2(20)
    );insert into t_test values(......);
    ....create or replace procedure procedure_name(
      inID      in  VARCHAR2,
      AppCode   out VARCHAR2,
      ErrorMsg  out VARCHAR2,
      outRecCur out SYS_REFCURSOR  --不要用cursor
    )as
    begin
      open outRecCur for
        select * from t_test;  AppCode := 1;
    exception
     when others then
      AppCode := 0;
      ErrorMsg := SQLERRM;
    end;
      

  2.   

    请教下,为什么不要用cursor?事实上我建存储过程时如果写cursor,pl/sql是报错的,只能写
    SYS_REFCURSOR  ,但我要测试的那个存储过程文档是写的cursor
      

  3.   


    --cursor 的语法是 cursor cursor_name is SQL语句
    --自定义游标大致可以分为两种,一种是 cursor cursor_name is SQL语句
    ---这种的作用是循环处理数据的,不用于将数据结果集返回
    ---另外一种就是我写的 游标变量的形式(SYS_REFCURSOR)这种写法是返回结果集用的--如果你就想用普通cursor的话,按照你的描述,必须定义一个记录类型数组,然后将结果插入数组中
    --再将这个记录类型数组返回(需要借助于包)
    create table t_test(
      outID VARCHAR2(20),
      outName VARCHAR2(20),
      outRID VARCHAR2(20),
      outRType VARCHAR2(20), 
      outRCount VARCHAR2(20)) --包头声明
    create or replace package my_pakage as
      --记录型变量
      type my_record is record( 
         outID VARCHAR2(20),
         outName VARCHAR2(20),
         outRID VARCHAR2(20),
         outRType VARCHAR2(20), 
         outRCount VARCHAR2(20)); 
      --记录型数组
      type my_varray is table of my_record index by binary_integer;、
      --存储过程声明
      procedure procedure_name(
        inID      in  VARCHAR2,
        AppCode   out VARCHAR2,
        ErrorMsg  out VARCHAR2,
        outRecCur out my_varray --这里就是记录型数组类型
      );
    end my_pakage;--声明包体
    create or replace package body my_pakage as
      --实现存储过程的声明
      procedure procedure_name(
        inID      in  VARCHAR2,
        AppCode   out VARCHAR2,
        ErrorMsg  out VARCHAR2,
        outRecCur out my_varray
      )
      as
      begin
        select * bulk collect
          into outRecCur
          from t_test;
    exception
     when others then
      AppCode := 0;
      ErrorMsg := SQLERRM;
    end;end;
    /