oracle存储过程中游标的问题

Richard123m 2016-11-17 05:09:51
写一个存储过程,格式如下:

执行,出现以下错误:

根据提示去掉declare,出现以下错误:

各位大神,何解?怎么办呢?谢谢!
...全文
306 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Richard123m 2016-11-18
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:
谢谢!我先试试,有问题再请教你!
卖水果的net 2016-11-17
  • 打赏
  • 举报
回复

--  我给你写了个例子,用到了游标、with 、order by 这些关键字 ,你参考一下,有问题再追问

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as oracle@ORALAB

SQL> 
SQL> create table test(id int, name varchar(10));
Table created
SQL> begin
  2      insert into test values(1,'zhang') ;
  3      insert into test values(2,'wang');
  4  end ;
  5  /
PL/SQL procedure successfully completed
SQL> create table test_bak(id int, name varchar(10));
Table created
SQL> create procedure sp_a
  2  is
  3      v_id int ;
  4      v_name varchar(10);
  5  
  6      cursor ss is select * from (
  7          with m as
  8          (select * from test)
  9          select * from m
 10          union all
 11          select * from m
 12      )
 13       order by id;
 14  begin
 15      open ss ;
 16      fetch ss into v_id, v_name ;
 17      loop
 18          exit when not ss%found ;
 19          insert into test_bak values(v_id, v_name) ;
 20          fetch ss into v_id, v_name;
 21      end loop ;
 22  
 23  end ;
 24  /
Procedure created
SQL> call sp_a() ;
Method called
SQL> select * from test ;
                                     ID NAME
--------------------------------------- ----------
                                      1 zhang
                                      2 wang
SQL> select * from test_bak ;
                                     ID NAME
--------------------------------------- ----------
                                      1 zhang
                                      1 zhang
                                      2 wang
                                      2 wang
SQL> drop table test purge ;
Table dropped
SQL> drop table test_bak purge ;
Table dropped
SQL> drop procedure sp_a ;
Procedure dropped

SQL> 
卖水果的net 2016-11-17
  • 打赏
  • 举报
回复
你这个存储过程的问题,还真不少,如果楼主是为了练习,不妨把这些代码简化一些; 比如,缺少分号、 is 后面跟 declare 等 等 ;
sych888 2016-11-17
  • 打赏
  • 举报
回复
1、DECLARE去掉 2、游标打开集合用一个语句就行了,不用UNION ALL 排序后的结果,插入堆表中也不能保证是有序的,所有直接插入就行 3、要是练习的话,另说 单从语句的功能和性能来说,没有用存储过程,一条SQL语句就能搞定了 insert into tab select .....from ...
js14982 2016-11-17
  • 打赏
  • 举报
回复
sursor cur_re is select * from tab_a union all select * from tab_b order by 1 另外,在union all语句中,排序操作order by只能在末尾用一个order by
js14982 2016-11-17
  • 打赏
  • 举报
回复
存储过程中不用declare。游标也不要用临时表 with tab as 这种形式

3,491

社区成员

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

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