Oracle分页存储过程的疑问

luokuangcun 2011-07-31 09:52:14
这是我的分页存储过程:

create or replace package testpackage as
TYPE test_cursor is ref cursor;
end testpackage;
--开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,
Pagesize in number,--一页显示记录数
pageNow in number,
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out testpackage.test_cursor--返回的记录集
) is
--定义部分
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*Pagesize+1;
v_end number:=pageNow*Pagesize;
begin
--执行部分
v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||')
t1 where
rownum<='||v_end||') where rn>='||v_begin;
--v_sql:='select rownum as columid,t1.* from '||tableName||' t1 where rownum<='||v_end||' and
--rn>='||v_begin||'order by columid asc';

--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql语句
v_sql:='select count(*) from '||tableName;
--执行sql,并把返回的值,赋给myrows;
execute inmediate v_sql into myrows;
--计算myPageCount
--if myrows%Pagesize=0 then这样写是错的
if mod(myrows,Pagesize)=0 then
myPageCount:=myrows/Pagesize;
else
myPageCount:=myrows/Pagesize+1
end if;
--关闭游标
close p_cursor;
end;


红色部分的语句我使用两个sql语句,都不能通过编译,不知道是这里的问题还是其他问题,错误代码是:
PLS-00103:Encounted the symbol 'CREATE'
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wallace_jjh 2011-07-31
  • 打赏
  • 举报
回复
感觉你问的这么乱啊
前后贴出来的代码都不一致,请耐心的再看看自己写出来的SQL,
首先(execute inmediate v_sql into myrows; ),“inmediate ”错了,应该是“immediate”。
第二:(myPageCount:=myrows/Pagesize+1)后面“;”忘记了

你问的那个红色的部分可以去掉,如果你就加一个“’”,那倒错了。
luokuangcun 2011-07-31
  • 打赏
  • 举报
回复
我把错误信息贴上去,请高手解决:

SQL> --开始编写分页的过程
SQL> create or replace procedure fenye
2 (tableName in varchar2,
3 Pagesize in number,--一页显示记录数
4 pageNow in number,
5 myrows out number,--总记录数
6 myPageCount out number,--总页数
7 p_cursor out testpackage.test_cursor--返回的记录集
8 ) is
9 --定义部分
10 --定义sql语句 字符串
11 v_sql varchar2;
12 --定义两个整数
13 v_begin number:=(pageNow-1)*Pagesize+1;
14 v_end number:=pageNow*Pagesize;
15 begin
16 --执行部分
17 v_sql:='select * from ( rownum rn,select t1.* from '||tableName||' t1)
18 where rn<='||v_end||' and rn>='||v_begin|| ';
19 --把游标和sql关联
20 open p_cursor for v_sql;
21 --计算myrows和myPageCount
22 --组织一个sql语句
23 v_sql:='select count(*) from dual';
24 --执行sql,并把返回的值,赋给myrows;
25 execute immediate v_sql into myrows;
26 --计算myPageCount
27 --if myrows%Pagesize=0 then这样写是错的
28 if mod(myrows,Pagesize)=0 then
29 myPageCount:=myrows/Pagesize;
30 else
31 myPageCount:=myrows/Pagesize+1
32 end if;
33 --关闭游标
34 close p_cursor;
35 end;
36 /

Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE FENYE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
23/9 PLS-00103: Encountered the symbol "SELECT" when expecting one of
the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like
between || member SUBMULTISET_
The symbol ";" was substituted for "SELECT" to continue.

23/34 PLS-00103: Encountered the symbol ";
--执行sql,并把返回的值,赋给myrows;
execute immediate v_sql i" when expecting one of the following:
. , @ ; for <an identifier>

LINE/COL ERROR
-------- -----------------------------------------------------------------
<a double-quoted delimited-identifier> group having intersect
minus order partition start subpartition union where connect
SAMPLE_


另外:我想问一下:

17 v_sql:='select * from ( rownum rn,select t1.* from '||tableName||' t1)
18 where rn<='||v_end||' and rn>='||v_begin|| ';
中的红色部分可不可以去掉?
Jake443403168 2011-07-31
  • 打赏
  • 举报
回复
1、创建包裹后加上 /  ,那个create错误就是这个造成的
下面2点就是楼上说的
2、execute inmediate v_sql into myrows; immediate书写错误

3、myPageCount:=myrows/Pagesize+1 缺;

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧