oracle存储过程


--基本语法
create or replace procedure hello
as
begin
dbms_output.put_line('hello word');
end;

--执行
1.--sqlplus命令
execute
exec

2.begin .... end;

3.call--sql命令

exec hello();

call hello();

--带参数存储过程
create or replace procedure money(eid in number)
as
oldmoney pro_test.money%type;--引用变量
begin
select t.money into oldmoney from pro_test t where t.id=eid;
update pro_test t set t.money=t.money+100 where t.id=eid;
dbms_output.put_line(oldmoney);
end;
call money(3);

--存储函数
create or replace function querymoney(eid in number)
return number
as
oldmoney pro_test.money%type;
oldname pro_test.name%type;
begin
select t.name,t.money into oldname,oldmoney from pro_test t where t.id=eid;
return nvl(oldmoney,0)*12;
end;

--out参数
create or replace procedure queryone(eid in number,
ename out varchar2,
emoney out number)
as
begin
select t.name,t.money into ename,emoney from pro_test t where t.id=eid;
end;

--包头
create or replace package mypackage
as
--声明游标
type mycursor is ref cursor;
--定义存储过程
procedure queryList(eid in number,eList out mycursor);
end mypackage;

--包体
create or replace package body mypackage
as
procedure queryList(eid in number,eList out mycursor)
as
begin
open eList for select * from pro_test;
end queryList;
end mypackage;

--返回结果集
create or replace procedure testList(eList out sys_refcursor)
as
begin
open eList for select * from pro_test;
end;

--,综合
create or replace procedure cursorTest(eList out sys_refcursor)
as
inta number;
CURSOR cur_1 IS
select * from pro_test;
CURSOR cur_2 is
select * from pro_test;
cur_3 SYS_REFCURSOR;
popo varchar2(100);
begin
FOR rec IN cur_1 LOOP
DBMS_OUTPUT.put_line(rec.name);
end loop;
inta:=2;
DBMS_OUTPUT.put_line(inta);
if inta>2 then
begin
inta:=inta*10;
end;
elsif inta<=2 then
begin
inta:=inta*50;
end;
else
begin
DBMS_OUTPUT.put_line('判断结束');
end;
end if;
DBMS_OUTPUT.put_line(inta);
while inta<10000 loop
inta:=inta+100;
end loop;
DBMS_OUTPUT.put_line(inta);
if popo is null then
DBMS_OUTPUT.put_line('popo is null');
end if;
if popo<>null then
DBMS_OUTPUT.put_line('popo <> null');
end if;
end cursorTest;

-----------------------------------------------------------------------
实例

下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:

现假设存在两张表,一张是学生成绩表(studnet) ,字段为:stdId,math,article,language,music,sport,total,average,step

一张是学生课外成绩表(out_school), 字段为:stdId,parctice,comment

通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A ,就在总成绩上加20 分。

create or replace procedure autocomputer(step in number) is

rsCursor SYS_REFCURSOR;

commentArray myPackage.myArray;

math number;

article number;

language number;

music number;

sport number;

total number;

average number;

stdId varchar(30);

record myPackage.stdInfo;

i number;

begin

i := 1;

get_comment(commentArray); -- 调用名为get_comment() 的存储过程获取学生课外评分信息

OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;

LOOP

fetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;

total := math + article + language + music + sport;

for i in 1..commentArray.count LOOP

record := commentArray(i);

if stdId = record.stdId then

begin

if record.comment = 'A' then

begin

total := total + 20;

go to next; -- 使用go to 跳出for 循环

end;

end if;

end;

end if;

end LOOP;

<<continue>> average := total / 5;

update student t set t.total=total and t.average = average where t.stdId = stdId;

end LOOP;

end;

end autocomputer;

-- 取得学生评论信息的存储过程

create or replace procedure get_comment(commentArray out myPackage.myArray) is

rs SYS_REFCURSOR ;

record myPackage.stdInfo;

stdId varchar(30);

comment varchar(1);

i number;

begin

open rs for select stdId,comment from out_school

i := 1;

LOOP

fetch rs into stdId,comment; exit when rs%NOTFOUND;

record.stdId := stdId;

record.comment := comment;

recommentArray(i) := record;

i:=i + 1;

end LOOP;

end get_comment;

-- 定义数组类型myArray

create or replace package myPackage is begin

type stdInfo is record(stdId varchar(30),comment varchar(1));

type myArray is table of stdInfo index by binary_integer;

end myPackage;

JDBC调用存储过程

CallableStatement cs = conn.prepareCall("{call all_user()}");

  cs.setInt(1, 3);

  cs.registerOutParameter(2, Types.CHAR);

  cs.execute();

  String name =cs.getString(2);

hibernate调用存储过程

HibernateSessionFactory.getSession().createSQLQuery("{Call proc()}");  Listlist=query.list(); 
session.connection(); CallableStatement cs = conn.prepareCall("{call all_user()}");

jpa调用存储过程

  entityManager.createNativeQuery

  注解@NamedStoredProcedureQueries

  

//假如我要获取一个User的集合,这个存储过程名字是GetUserList()
Queryquery=em.createNativeQuery("{callGetUserList()}",User.class);
List<User>result=query.getResultList();

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn