大家好,现在创建了一个oracle包 DotNet如下:    create or replace package DotNet is  -- Author  : good_hy
  -- Created : 2004-12-13 13:30:30
  -- Purpose :  TYPE type_cur IS REF CURSOR;     --定义游标变量用于返回记录集  PROCEDURE DotNetPagination(
  Pindex in number,                --分页索引
  Psql in varchar2,                --产生dataset的sql语句
  Psize in number,                 --页面大小
  v_cur out type_cur               --返回当前页数据记录
  );end DotNet;
然后有一个包体:create or replace package body DotNet is --*************************************************************************************** PROCEDURE DotNetPagination(
           
  Pindex in number,
  Psql in varchar2,
  Psize in number,
  v_cur out type_cur        ---记录总数
  
 )
 AS  v_sql VARCHAR2(1000);
  v_count number;
  v_Plow number;
  v_Phei number;
  
 Begin
  ------------------------------------------------------------取分页总数
  v_sql := 'select count(*) from (' || Psql || ')';
  execute immediate v_sql into v_count;  ------------------------------------------------------------显示任意页内容
  
  v_Phei := Pindex * Psize + Psize;
  v_Plow := v_Phei - Psize + 1;
  
  --Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段
  
  v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ; open v_cur for v_sql; End DotNetPagination;
 end DOtnet;但是我在程序里面调用这个包的存储过程的时候一直报:
pls-00201:dotnet不是过程或尚未定义
pls--00201:statment ignored;
 知道的帮忙一下,谢谢。

解决方案 »

  1.   

    cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = "Dotnet";//包名                    cmd.Parameters.Add("Psize", OracleDbType.Int32, 10);//分页大小
                        cmd.Parameters.Add("Pindex", OracleDbType.Int32, 10);//页码
                        cmd.Parameters.Add("Psql", OracleDbType.Varchar2, 3000);//sql语句
                      //  cmd.Parameters.Add("Pcount", OracleDbType.Int32, 10);//返回得记录总数
                        cmd.Parameters.Add("v_cur", OracleDbType.RefCursor);//返回得记录集                    cmd.Parameters["Psize"].Value = PageSize;
                        cmd.Parameters["Pindex"].Value = PageIndex;
                        cmd.Parameters["Psql"].Value = StrSql;
                      //  cmd.Parameters["Pcount"].Direction = ParameterDirection.Output;
                        cmd.Parameters["v_cur"].Direction = ParameterDirection.Output;
                                          //  try
                       // {
                       
                            OracleDataAdapter ODAdapter = new OracleDataAdapter(cmd);
                            cmd.Connection = conn;
                            conn.Open();
                            DataSet dataset = new DataSet();
                            ODAdapter.Fill(dataset);
                         ///   TotalCount = int.Parse(cmd.Parameters["Pcount"].Value.ToString());
                            return dataset;
      

  2.   

    调用存储过程之后返回的游标,你是否使用了For循环的方式遍历结果集,
    即使用了 如 For i in mycur的方式
    如果是,建议换种方式试试

    Loop
      fetch .. into ..
      exit when..end loop;
      

  3.   

    没有啊,在pl/sq里面用EXEC dotnet显示不是过程,尚未定义
      

  4.   

    exec DotNet.DotNetPagination(参数)..
    或者参考这个吧
    create or replace procedure pro_SysCur(CId in varchar2,Cur_Stu out sys_refcursor) AS
    begin    
    open Cur_Stu for select name,age from student where ClassId=CId;
    end;declare    
    C_Stu Sys_RefCursor;    
      type rec_stu is record(        
      tname student.name%type,        
      tage  student.age%type    
    );     
    rw_stu rec_stu;
    begin    pro_syscur('C001',c_stu);    
      LOOP
        fetch c_stu into rw_stu;       
        exit when c_stu%notfound;       
        dbms_output.put_line('姓名='||rw_stu.tname||' 年龄='||rw_stu.tage);    
      end loop;
    end;
      

  5.   

    用PLSQL 去package bodies里面找一下你这个存储过程,如果有的话就编译一下,看看是否报错,如果没有,就没啥说的了,你再重新创建一个吧
      

  6.   


    EXEC dotnetdotnet是包,又不能这样调用的
    只能调用包里的存储过程
    EXEC dotnet.DotNetPagination(参数)