我在包中建立了下面这个包CREATE OR REPLACE PACKAGE MY_TYPES AS  
    TYPE PageSQL_CURSOR IS REF CURSOR;   
END;然后在函数中创建下面函数create or replace function PageSQL
(QueryStr IN VARCHAR2 , --表名、视图名、查询语句
 PageSize IN INTEGER :=10 ,   --每页的大小(行数)
 PageCurrent IN INTEGER :=1 ,  --要显示的页
 FdShow IN VARCHAR2 :=null ,--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
 FdOrder IN VARCHAR2 :=null  --排序字段列表
)
return TYPES.PageSQL_CURSOR IS RetCursor TYPES.PageSQL_CURSOR;--返回游标
    
    --定义使用的变量
    QueryStrVar VARCHAR2(4000);
    FdShowVar VARCHAR2(4000);
    FdOrderVar VARCHAR2(1000);
    --
    --FdName VARCHAR2(250); --表中的主键或表、临时表中的标识列名
    Id1 INTEGER;
    Id2 INTEGER; --开始和结束的记录号
    ObjCount INTEGER; --对象个数
    --Obj_ID INTEGER;   --对象ID
    --表中有复合主键的处理
    --strfd VARCHAR2(2000); --复合主键列表
    --strjoin VARCHAR2(4000); --连接字段
    --strwhere VARCHAR2(2000); --查询条件
    --
    sqlStr VARCHAR2(4000); --查询sqlBEGIN
    --1.给变量赋值
    --ObjCount Obj_ID
    SELECT COUNT(1) INTO ObjCount FROM USER_OBJECTS WHERE OBJECT_NAME = QueryStr;    --FdShow
    if( FdShow is null ) then
        FdShowVar := ' *';
    else
        FdShowVar := ' '||FdShow;
    end if;
    --FdOrder
    if( FdOrder is null ) then
        FdOrderVar := ' ';
    else
        FdOrderVar := ' order by '||FdOrder;
    end if;
    --QueryStr
    if(ObjCount>0) then
        QueryStrVar := ' '||QueryStr;
    else
        QueryStrVar :=  ' ('||QueryStr||') A';
    end if;    
    --Id1 Id2
    Id1 := (PageCurrent-1)*PageSize+1;
    Id2 := PageCurrent * PageSize;
    
    
    --if( Obj_ID is not null ) then --是表
        sqlStr := 'SELECT ROW__.* FROM ( SELECT ROWNUM ROWNUM_, ROW_.* FROM ('
        ||'SELECT '||FdShowVar||' FROM '||QueryStrVar||FdOrderVar
        ||') ROW_  ) ROW__ WHERE ROWNUM_ BETWEEN '||Id1||' AND '||Id2;
    --else 
    
    --end if;
    --DBMS_OUTPUT.PUT_LINE(sqlStr);
    --2.执行查询
    OPEN RetCursor FOR sqlStr;    return (RetCursor);END PageSQL;编译时,报必须声明标识符'TYPES.PageSQL_CURSOR'的错误,怎么回事啊?

解决方案 »

  1.   

    你自己創建的是MY_TYPES 吧,不是TYPES
      

  2.   

    create or replace function PageSQL
    (QueryStr IN VARCHAR2 , --表名、视图名、查询语句
     PageSize IN INTEGER :=10 , --每页的大小(行数)
     PageCurrent IN INTEGER :=1 , --要显示的页
     FdShow IN VARCHAR2 :=null ,--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
     FdOrder IN VARCHAR2 :=null --排序字段列表
    )
    return sys_refcursor IS 
    RetCursor sys_refcursor;--返回游标  --定义使用的变量
      QueryStrVar VARCHAR2(4000);
      FdShowVar VARCHAR2(4000);
      FdOrderVar VARCHAR2(1000);
      --
      --FdName VARCHAR2(250); --表中的主键或表、临时表中的标识列名
      Id1 INTEGER;
      Id2 INTEGER; --开始和结束的记录号
      ObjCount INTEGER; --对象个数
      --Obj_ID INTEGER; --对象ID
      --表中有复合主键的处理
      --strfd VARCHAR2(2000); --复合主键列表
      --strjoin VARCHAR2(4000); --连接字段
      --strwhere VARCHAR2(2000); --查询条件
      --
      sqlStr VARCHAR2(4000); --查询sqlBEGIN
      --1.给变量赋值
      --ObjCount Obj_ID
      SELECT COUNT(1) INTO ObjCount FROM USER_OBJECTS WHERE OBJECT_NAME = QueryStr;  --FdShow
      if( FdShow is null ) then
      FdShowVar := ' *';
      else
      FdShowVar := ' '||FdShow;
      end if;
      --FdOrder
      if( FdOrder is null ) then
      FdOrderVar := ' ';
      else
      FdOrderVar := ' order by '||FdOrder;
      end if;
      --QueryStr
      if(ObjCount>0) then
      QueryStrVar := ' '||QueryStr;
      else
      QueryStrVar := ' ('||QueryStr||') A';
      end if;
      --Id1 Id2
      Id1 := (PageCurrent-1)*PageSize+1;
      Id2 := PageCurrent * PageSize;
      --if( Obj_ID is not null ) then --是表
      sqlStr := 'SELECT ROW__.* FROM ( SELECT ROWNUM ROWNUM_, ROW_.* FROM ('
      ||'SELECT '||FdShowVar||' FROM '||QueryStrVar||FdOrderVar
      ||') ROW_ ) ROW__ WHERE ROWNUM_ BETWEEN '||Id1||' AND '||Id2;
      --else  --end if;
      --DBMS_OUTPUT.PUT_LINE(sqlStr);
      --2.执行查询
      OPEN RetCursor FOR sqlStr;  return (RetCursor);END PageSQL;