oracle存储过程笔记

1。第一个: 这是一个简单的把一条数据插入到某一个表中的sql
   执行: exec p_test;
Java 代码
  1. CREATE OR REPLACE PROCEDURE p_test  
  2.   is  
  3.   v_id    TJ_JTCD.Id%TYPE;  
  4.   v_zgrs  TJ_JTCD.ZGRS%TYPE;  
  5.   v_qys   TJ_JTCD.QYS%TYPE;  
  6.   v_date  TJ_JTCD.Createdate%TYPE;  
  7.   CURSOR   c_emp   IS   SELECT   2,1,1,sysdate   FROM   dual;   --这里创建了一个游 标 c_emp  
  8.   
  9.   BEGIN  
  10.   OPEN   c_emp;     -- 打开这个游标  
  11.   LOOP              --做循环  
  12.   FETCH   c_emp   INTO   v_id,v_zgrs,v_qys,v_date;  
  13.   EXIT   WHEN   c_emp%NOTFOUND;    -- 当没有结果集以后,就结束循环  
  14.   insert into tj_jtcd values(v_id,v_zgrs,v_qys,v_date);  
  15.   END loop;  
  16.  end p_test;  


2。第二个: 是从一个表中查出来多条数据,然后把这多条数据通过循环插入到某一个表中
   执行: exec p_test;
Java 代码
  1. CREATE OR REPLACE PROCEDURE p_test  
  2.   is  
  3.   v_id    TJ_JTCD.Id%TYPE;  
  4.   --v_zgrs  TJ_JTCD.ZGRS%TYPE;  
  5.   --v_qys   TJ_JTCD.QYS%TYPE;  
  6.   v_date  TJ_JTCD.Createdate%TYPE;  
  7.   CURSOR   c_emp   IS     
  8.   select t.wgno from p_wginfo t where t.wgtype = 3;  
  9.   --SELECT   2,1,1,sysdate   FROM   dual;   --这里创建了一个游 标 c_emp  
  10.   
  11.   BEGIN  
  12.   OPEN   c_emp;     -- 打开这个游标  
  13.   LOOP              --做循环  
  14.   FETCH   c_emp   INTO   v_id; --,v_zgrs,v_qys,v_date;  
  15.   EXIT   WHEN   c_emp%NOTFOUND;    -- 当没有结果集以后,就结束循环  
  16.     
  17.   insert into tj_jtcd values(tjfx_sequence.nextval,1,1,v_date,v_id);  
  18.   END loop;  
  19.   commit;  
  20.  end p_test;  

3。 第三个: 两个游标的写法,并且第二个游标是带参数的.
    执行: exec p_test;
Java 代码
  1. CREATE OR REPLACE PROCEDURE p_test  
  2.   is  
  3.  -- v_id    TJ_JTCD.Id%TYPE;  
  4.   v_wgno    tj_jtcd.wgno%type;  
  5.   v_zgrs    tj_jtcd.zgrs%type;  
  6.   v_qys     tj_jtcd.qys%type;  
  7.   v_ny      tj_jtcd.ny%type;  
  8.   
  9.   CURSOR   c_emp    -- 游标1  
  10.   IS     
  11.   select t.wgno from p_wginfo t where t.wgtype = 3;  
  12.     
  13.   CURSOR c2  -- 游标2  
  14.   IS  
  15.   select 1,1,'1'  
  16.   --sum(y.zgzs) as zgrs, count(*) as qys,to_char(to_date(y.lhrq, 'yyyy-mm-dd'), 'yyyy-mm') as ny   
  17.    from dual d ;  
  18.    --where y.id in(select b.zjj_id from b_Laodj_Jtcd b where b.ent_id in (select c.ent_id from c_ygdw c where 1 = 1)) group by to_char(to_date(y.lhrq, 'yyyy-mm-dd'), 'yyyy-mm');  
  19.   
  20.   BEGIN  
  21.   OPEN   c_emp;     -- 打开游标1  
  22.   LOOP              -- 做循环  
  23.   FETCH   c_emp   INTO   v_wgno; --,v_zgrs,v_qys,v_date;  
  24.   EXIT   WHEN   c_emp%NOTFOUND;    -- 当没有结果集以后,就结束循环  
  25.     
  26.   open c2;  
  27.   LOOP  
  28.   fetch c2 into v_zgrs,v_qys,v_ny;  
  29.   EXIT   WHEN   c2%NOTFOUND;  
  30.   insert into tj_jtcd(id,zgrs,qys,createdate,wgno,ny) values(tjfx_sequence.nextval,v_zgrs,v_qys,sysdate,v_wgno,v_ny); -- 插入数据  
  31.     
  32.   end loop;  
  33.   close c2;  
  34.   
  35.   END loop;  
  36.   CLOSE  c_emp;  
  37.   commit;  
  38.  end p_test;  



4。带参数的存储过程(完整版)。
  执行: exec p_test('2009-01-01','2009-10-01');
 
Java 代码
  1. CREATE OR REPLACE PROCEDURE p_test(stime in varchar2,etime in varchar2)   -- 创建带参数的存储过程  
  2.   is     
  3.      -- 以下定义了四个变量,由于这些变量赋值后要插入到tj_jtcd这个表中所以类型都要定义成一致  
  4.   v_wgno    tj_jtcd.wgno%type;       
  5.   v_zgrs    tj_jtcd.zgrs%type;     
  6.   v_qys     tj_jtcd.qys%type;     
  7.   v_ny      tj_jtcd.ny%type;     
  8.     
  9.   CURSOR   c_wgno    -- 游标1 取得所有的网格编号 共有95条   
  10.   IS        
  11.   select t.wgno from p_wginfo t where t.wgtype = 3;     
  12.        
  13.   CURSOR c_data(wgid varchar2)  -- 游标2  这是一个带参数的游标,这个参数是从第一个网格中取得,并且作为这个查 询中的一个条件  
  14.   IS     
  15.   select   
  16.   nvl(sum(y.zgzs),0) as zgrs, nvl(count(*),0) as qys,to_char(to_date(y.lhrq, 'yyyy-mm-dd'), 'yyyy-mm') as ny      
  17.    from y_laodj_jtcd y     
  18.    where   
  19.    to_date(y.lhrq,'yyyy-mm-dd') between to_date(stime,'yyyy-mm-dd') and to_date(etime,'yyyy-mm-dd') and  
  20.    y.id in(select b.zjj_id from b_Laodj_Jtcd b where b.ent_id in (select c.ent_id from c_ygdw c where 1 = 1 and c.wgno = wgid)) group by to_char(to_date(y.lhrq, 'yyyy-mm-dd'), 'yyyy-mm');     
  21.     
  22.     
  23.     
  24.   BEGIN     
  25.     
  26.   OPEN   c_wgno;     -- 打开游标1    
  27.   LOOP              -- 做循环     
  28.   FETCH   c_wgno   INTO   v_wgno; --对遍历游标1中的值     
  29.   EXIT   WHEN   c_wgno%NOTFOUND;    -- 当没有结果集以后,就结束循环     
  30.        
  31.   open c_data(v_wgno);          -- 打开游标c2  
  32.   LOOP  
  33.   fetch c_data into v_zgrs,v_qys,v_ny;    -- 遍历游标2里的值  
  34.   EXIT   WHEN   c_data%NOTFOUND;     
  35.                                  -- 以下是执行插入操作,插入的值来自于游标1,2中遍历的值  
  36.   insert into tj_jtcd(id,zgrs,qys,createdate,wgno,ny) values(tjfx_sequence.nextval,v_zgrs,v_qys,sysdate,v_wgno,v_ny); -- 插入数据     
  37.        
  38.   end loop;      -- 结束循环,并关闭游标2  
  39.   close c_data;     
  40.     
  41.   END loop;      -- 结束循环,并关闭游标1  
  42.   CLOSE  c_wgno;     
  43.     
  44.   commit;        -- 事务处理 提交 (这里有待完善)  
  45.     
  46.  end p_test;    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值