没有合适的资源?快使用搜索试试~ 我知道了~
Oracle存储过程和触发器实例
3星 · 超过75%的资源 需积分: 4 4 下载量 26 浏览量
2014-02-07
23:56:57
上传
评论
收藏 76KB DOC 举报
温馨提示
试读
12页
Oracle存储过程和触发器实例
资源推荐
资源详情
资源评论
Oracle 存储过程实例
Java 代码
1 create or replace procedure GetRecords(name_out out varchar2,age_in in varchar2) as
2 begin
3 select NAME into name_out from test where AGE = age_in;
4 end;
5
6 create or replace procedure insertRecord(UserID in varchar2, UserName in
varchar2,UserAge in varchar2) is
7 begin
8 insert into test values (UserID, UserName, UserAge);
9 end;
首先,在 Oracle 中创建了一个名为 TEST_SEQ 的 Sequence 对象,SQL 语句如下:
Java 代码
10 create sequence TEST_SEQ
11 minvalue 100
12 maxvalue 999
13 start with 102
14 increment by 1
15 nocache;
语法应该是比较易懂的,最小最大值分别用 minvalue,maxvalue 表示,初始值是 102(这个数
字是动态变化的,我创建的时候设的是 100,后因插入了 2 条数据后就自动增加了 2),increment
当然就是步长了。在 PL/SQL 中可以用 test_seq.nextval 访问下一个序列号,用 test_seq.currval 访
问当前的序列号。
定义完了 Sequence,接下来就是创建一个存储过程 InsertRecordWithSequence:
--这次我修改了 test 表的定义,和前面的示例不同。其中,UserID 是 PK。
Java 代码
16 create or replace procedure InsertRecordWithSequence(UserID out number,UserName
in varchar2,UserAge in number)
17 is
18 begin insert into test(id, name, age) --插入一条记录,PK 值从 Sequece 获取
19 values(test_seq.nextval, UserName, UserAge);
20 /*返回 PK 值。注意 Dual 表的用法*/
21 select test_seq.currval into UserID from dual;
22 end InsertRecordWithSequence;
为了让存储过程返回结果集,必须定义一个游标变量作为输出参数。这和 Sql Server 中有着很
大的不同!并且还要用到 Oracle 中“包”(Package)的概念,似乎有点繁琐,但熟悉后也会觉得很
方便。
关于“包”的概念,有很多内容可以参考,在此就不赘述了。首先,我创建了一个名为
TestPackage 的包,包头是这么定义的:
Java 代码
23 create or replace package TestPackage is
24 type mycursor is ref cursor; -- 定义游标变量
25 procedure GetRecords(ret_cursor out mycursor); -- 定义过程,用游标变量作为返回参数
26 end TestPackage;
27 包体是这么定义的:
28 create or replace package body TestPackage is
29 /*过程体*/
30 procedure GetRecords(ret_cursor out mycursor) as
31 begin
32 open ret_cursor for select * from test;
33 end GetRecords;
34 end TestPackage;
小结:
包是 Oracle 特有的概念,Sql Server 中找不到相匹配的东西。在我看来,包有点像 VC++的
类,包头就是.h 文件,包体就是.cpp 文件。包头只负责定义,包体则负责具体实现。如果包返回多
个游标,则 DataReader 会按照您向参数集合中添加它们的顺序来访问这些游标,而不是按照它们
在过程中出现的顺序来访问。可使用 DataReader 的 NextResult()方法前进到下一个游标。
Java 代码
35 create or replace package TestPackage is
36 type mycursor is ref cursor;
37 procedure UpdateRecords(id_in in number,newName in varchar2,newAge in number);
38 procedure SelectRecords(ret_cursor out mycursor);
39 procedure DeleteRecords(id_in in number);
40 procedure InsertRecords(name_in in varchar2, age_in in number);
41 end TestPackage;
包体如下:
Java 代码
42 create or replace package body TestPackage is
43 procedure UpdateRecords(id_in in number, newName in varchar2, newAge in
number) as
44 begin
45 update test set age = newAge, name = newName where id = id_in;
46 end UpdateRecords;
47
48 procedure SelectRecords(ret_cursor out mycursor) as
49 begin
50 open ret_cursor for select * from test;
51 end SelectRecords;
52
53 procedure DeleteRecords(id_in in number) as
54 begin
55 delete from test where id = id_in;
56 end DeleteRecords;
57
58 procedure InsertRecords(name_in in varchar2, age_in in number) as
59 begin
60 insert into test values (test_seq.nextval, name_in, age_in);
61 --test_seq 是一个已建的 Sequence 对象,请参照前面的示例
62 end InsertRecords;
63 end TestPackage;
TestPackage.SelectRecords
------------------------------------------------------------------------------------------------------------------------
oracle 存储过程的基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数 1 IN NUMBER,
参数 2 IN NUMBER
) IS
变量 1 INTEGER :=0;
变量 2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将 select 查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出 NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量 1,变量 2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用 for in 使用 cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名 1+cur_result.列名 2
END;
END LOOP;
END;
7.带参数的 cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE
TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8.用 pl/sql developer debug
连接数据库后建立一个 Test WINDOW
在窗口输入调用 SP 的代码,F9 开始 debug,CTRL+N 单步调试
剩余11页未读,继续阅读
资源评论
- lt85382014-03-01有用,就是太多了,不够精辟
ljm653467
- 粉丝: 0
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功