oracle 存储过程小记

内容都是从网上找的,具体引用了哪里的,不知道了,谢谢www.

 

 

1 oracle如何执行存储过程,

  在外面直接执行存储过程,java直接执行存储过程

 

  :可以直接用Java执行的

 

 

===========================================================

2 简单的存储过程例子

执行下面的建立表的语句,将存储过程的语句copy到plus/sql,

执行时,注意要用/结束,执行。

--建立测试表

create table procedure_tab 

(

usersNAME varchar2(8) not null,

EMAIL varchar2(30),

FLAG number

);  

--插入语句

insert into test(usersNAME,EMAIL,FLAG) values('kiccleaf','kiccleaf@openzj.com',2);

 

--建立简单的存储过程

CREATE OR REPLACE  PROCEDURE pro_simple (

Xuan_usersname in varchar2 

)

as

begin

update procedure_tab  set usersNAME =Xuan_usersname  where FLAG=2;

commit;

end pro_simple;

/

 

--测试:

execute pro_simple('leaf');

==========================================================================

3 例子2   有游标的

--create table

create table users

(id number(3) primary key,

 usersname varchar2(30)

 );

insert into users values(1,'a');

insert into users values(2,'b');

insert into users values(3,'c');

insert into users values(4,'d');

insert into users values(5,'e');

insert into users values(6,'f');

insert into users values(7,'g');

insert into users values(8,'h');

insert into users values(9,'i');

commit;

 

---create procedure

drop procedure if exists pro_users;

create or replace procedure pro_users(

  p_id in number,  

  out_info out varchar2

)

is 

v_row  users%rowtype;    ---和users是一个类型的

cursor v_cur is select * from users;

begin

if p_id > 0  then

select * into v_row from users where id=p_id;

out_info := v_row.id || '=' || v_row.usersname;

else

open v_cur;

loop

fetch v_cur into v_row;

exit when v_cur%notfound;

if out_info is null then 

out_info := v_row.id||'='||v_row.usersname;

else

out_info :=out_info||','||v_row.id||'='||v_row.usersname;

end if;

end loop;

close v_cur;

end if;

exception

when too_many_rows then  

DBMS_OUTPUT.PUT_LINE('返回值多于1行');  

when others then  

DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!'); 

end;  

 /

 

 

---test

set serveroutput on;  --打开输出开关,这样才能dbms_output.put_line管用

declare 

v_id number := -1;

v_info varchar2(400);

begin

pro_users(v_id,v_info);

DBMS_OUTPUT.PUT_LINE(v_info);  

end;

 

=============================================================================

3 例子2

游标分为 

游标:用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。 

1.静态游标:包括显式游标和隐式游标。 

2.REF游标:是一种引用类型,类似于指针。 

 

--包代码

create or replace package pack_test is  

       type cur_test is ref cursor;  

end pack_test; 

 

--存储过程

create or replace procedure proc_cur(  

       p_id in number,  

       p_cur out pack_test.cur_test)   

is   

       v_sql varchar2(400);   

begin  

       if p_id = 0 then   

          open p_cur for select * from users;   

       else   

          v_sql := 'select * from users where id =: p_id';   

          open p_cur for v_sql using p_id;   

       end if;   

end proc_cur; 

 

--脚本测试代码 

-- Test statements here  

declare   

  v_id number := 1;  

  v_row users%rowtype;  

  p_cur pack_test.cur_test;  

begin   

  proc_cur(v_id, p_cur);  

  loop  

    fetch p_cur into v_row;  

    exit when p_cur%notfound;  

    DBMS_OUTPUT.PUT_LINE(v_row.id||'='||v_row.usersname);  

  end loop;  

  close p_cur;  

end;  

=====================================================================

4 例子4

 

CREATE SEQUENCE SEQ_B_USER_ID INCREMENT BY 1 START WITH 1; 

 

create table buser(

id  number(3),

username varchar2(30),

nickname varchar2(40),

status  number(2),

createdtime date

);

 

create or replace  

PROCEDURE p_insert_t   

(v_x in NUMBER)   

IS  

temp_id number;   

BEGIN  

FOR i IN 1..v_x LOOP   

select SEQ_B_USER_ID.nextval into temp_id from dual;   

insert into buser (id, username, nickname, status, createdtime) values(temp_id, to_char(temp_id), to_char(temp_id), 0, sysdate);   

END LOOP;   

END;   

/

 

execute p_insert_t (20);

 

 

*********其它的一些代码*************

 随机数:

sql 代码

select dbms_random.value(1,20) from dual;  

 游标的使用例子:

sql 代码

SET SERVERIUTPUT ON     

DECLARE     

CURSOR c_emp IS select title from bookmarkcategory where username='130';   

r_emp c_emp%ROWTYPE;     

BEGIN     

 OPEN c_emp;     

 -- LOOP     

 FETCH c_emp INTO r_emp;     

    --EXIT WHEN c_emp%NOTFOUND;     

    --DBMS_OUT.PUT.PUT_LINE('Salary of Employee is'|| r_emp.title);     

  --END LOOP;     

 update bookmarkcategory set title = r_emp.title where id=121;   

 CLOSE c_emp;     

END;    

==============================================================================

存储过程返回指定行数

 

---该sql可以返回指定行数的记录 

SELECT results.* FROM  

SELECT t2.*, rownum rownumber FROM  

   ( SELECT t.* FROM buser t ) t2

) results  

WHERE results.rownumber BETWEEN 3 and 5 ;

 

--proc

create or replace package pack_getCondRows is  

       type cur_test is ref cursor;  

end pack_getCondRows; 

 

--返回指定的行间的记录,好像表不能动态的搞呢

create or replace procedure proc_cur2(  

        begno in number,  

        endno in number,

       -- tablename in varchar2,

        p_cur out pack_getCondRows.cur_test)   

is   

       v_sql varchar2(400);   

begin  

 

          v_sql := 'SELECT results.* FROM  

SELECT t2.*, rownum rownumber FROM  

   ( SELECT t.* FROM buser t ) t2

) results  

WHERE results.rownumber BETWEEN :begno and :endno ';  

          open p_cur for v_sql using  begno,endno;   

end proc_cur2; 

 

 

 

===========================================================================

尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值