【讨论】一个游标的中select和rownum的问题

[复制链接]
查看11 | 回复8 | 2014-2-27 06:00:13 | 显示全部楼层 |阅读模式
有一个存储过程,如下:
create or replace procedure fenye
(tableName in varchar2,--表名
v_pagesize in number,--每页显示记录数
pagenow in number--当前页
) is
--定义一个变量用来传sql语句。
v_sql varchar2(1000);
--定义2个整数,开始和结束行号
v_beginnum number:= (pagenow-1)*v_pagesize+1;
v_endnum number:= pagenow*v_pagesize;
myrows number;--总记录数
mypagecount number;--总页数
p_cursor mypack2.my_cursor2; --返回的记录集

v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_mgr emp.mgr%type;
v_hiredate emp.hiredate%type;
v_sal emp.sal%type;
v_comm emp.comm%type;
v_deptno emp.deptno%type;

begin
v_sql:=*select empno,ename,job,mgr,hiredate,sal,comm,deptno from (select t1.*,rownum rn from (select * from *||tableName||*) t1 where rownum=*||v_beginnum;
--把游标和sql语句关联
open p_cursor for v_sql;
--计算myrows 和 mypagecount
--组织一个sql
v_sql:=*select count(*) from *||tableName;
--执行sql,并把返回的值,赋给myrows
execute immediate v_sql into myrows;
--计算mypagecount,mod是取模函数。
if mod(myrows,v_pagesize)=0 then
mypagecount:=myrows/v_pagesize;
else
mypagecount:=ceil(myrows/v_pagesize);--ceil(x)向大数取整,floor向小的取整。
end if;
loop
fetch p_cursor into v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno;
exit when p_cursor%notfound;
dbms_output.put_line(*姓名*||v_ename||*工号*||v_empno);
end loop;
dbms_output.put_line(*总记录数*||myrows||*总页数*||mypagecount||*当前页*||pagenow);
--关闭游标
--close p_cursor;
end;复制代码一位网友想把begin下面的select语句里把需要查询的换成 * 号,但是exec这个过程就会出错。
emp表中的所有列和上面select的列是一模一样的,就是换成星号会出错,不换就没错。

有人解释说换成select *后有rownum。
我不明白是什么意思,请各位指点一下。

回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
lz
v_sql:=*select empno,ename,job,mgr,hiredate,sal,comm,deptno from (select t1.*,rownum rn from (select * from *||tableName||*) t1 where rownum=*||v_beginnum;
这样写能编译通过?

回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
本帖最后由 rockpk008 于 2014-11-7 00:07 编辑
〇〇 发表于 2014-11-6 20:57
lz
v_sql:=*select empno,ename,job,mgr,hiredate,sal,comm,deptno from (select t1.*,rownum rn from (se ...

嗯,我知道那是啥意思,后面有个分页把rownum带进去了
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
fetch p_cursor into v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno;
这里要有rownum对应的变量,那前面换成select * 也是ok的
不过,好的书写习惯,还是select后跟上具体的列名最合适
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
同问,字符串哪有这么写的,根本编译就通不过。
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
lastwinner 发表于 2014-11-7 00:51
fetch p_cursor into v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno;
这里要有rownum对应 ...

是的,刚开始看的时候被笔者绕了一下,没看到下面还有一个fetch
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
newkid 发表于 2014-11-7 03:50
同问,字符串哪有这么写的,根本编译就通不过。

是的,已经提醒那个人了。多谢new版
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
42行要和select匹配
回复

使用道具 举报

千问 | 2014-2-27 06:00:13 | 显示全部楼层
rockpk008 发表于 2014-11-10 00:01
是的,刚开始看的时候被笔者绕了一下,没看到下面还有一个fetch

嗯,前后关联很重要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行