我在包中建立了下面这个包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'的错误,怎么回事啊?
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'的错误,怎么回事啊?
解决方案 »
- 求sql语句
- 求sqlplus里的常用命令!!
- 一个简单的T-SQL语句,怎么变成相对的PL/SQL语句?
- Oracle 函数可以返回cursor么??
- 把存储过程中定义的多个局部变量当一个记录集返回?有谁有办法吗?
- 关于select 语句的问题
- 如何查询帮助
- 如何从ORACLE库的数据导出到SYBASE里面?
- java.sql.SQLException: Io 异常: The Network Adapter could not establish the connec
- oracle存储过程一次返回多次次查询结果
- 前辈们,如果我想发展数据库架构方向,需要懂些什么?
- 用toad导入导出数据出错,帮忙看看,在线等..
(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;