orcale存储过程学习之路(一)
----------------------------------------- 建表 ------------------------------------------
create table test_user
(
id VARCHAR2(12),
name VARCHAR2(32),
age number(2)
)
select t.id,t.name,t.age from test_user t
insert into test_user (ID, NAME,age)
values ('1', '张三',12);
insert into test_user (ID, NAME,age)
values ('2', '李四',12);
insert into test_user (ID, NAME,age)
values ('3', '王五',12);
insert into test_user (ID, NAME,age)
values ('4', '赵六',21);
insert into test_user (ID, NAME,age)
values ('5', '田七',21);
----------------------------------------- 存储过程 ------------------------------------------
1.在packages文件夹下新建一个“包”,当新建时会同时出现两个供编辑的面板:一个为“声明”的,一个为“body”部分的。
2.编写两个空方法:
----------------------------------------- 声明部分 ------------------------------------------
create or replace package Pro_Test_User is
PROCEDURE Ins_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
PROCEDURE Upd_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
PROCEDURE Del_Test_User(I_ID IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2);
PROCEDURE Que_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2,O_RET_LIST OUT SYS_REFCURSOR);
PROCEDURE Que_Page_Test_User(I_ID IN VARCHAR2,I_NAME IN VARCHAR2,I_AGE IN VARCHAR2,I_PAGE_SIZE IN NUMBER,I_PAGE_NUM IN NUMBER,O_RET_CODE OUT NUMBER,O_RET_MSG OUT VARCHAR2,O_RET_TOTNUM OUT NUMBER,O_RET_LIST OUT SYS_REFCURSOR);
end Pro_Test_User;
----------------------------------------- BODY部分 ------------------------------------------
create or replace package body Pro_Test_User is
PROCEDURE Ins_Test_User(I_ID IN VARCHAR2,
I_NAME IN VARCHAR2,
I_AGE IN VARCHAR2,
O_RET_CODE OUT NUMBER,
O_RET_MSG OUT VARCHAR2)IS
BEGIN
O_RET_CODE:=0;
O_RET_MSG:='初始化默认成功';
IF I_ID IS NOT NULL AND I_NAME IS NOT NULL AND I_AGE IS NOT NULL THEN
INSERT INTO Test_User(ID,NAME,AGE) VALUES (I_ID,I_NAME,I_AGE);
COMMIT;
O_RET_CODE:=0;
O_RET_MSG:='操作成功';
ELSE
O_RET_CODE:=1;
O_RET_MSG:='没有ID|姓名|年龄';
END IF;
EXCEPTION
WHEN OTHERS THEN
O_RET_CODE:=-1;
O_RET_MSG:='sql执行过程出错啦!';
END Ins_Test_User;
PROCEDURE Upd_Test_User(I_ID IN VARCHAR2,
I_NAME IN VARCHAR2,
I_AGE IN VARCHAR2,
O_RET_CODE OUT NUMBER,
O_RET_MSG OUT VARCHAR2)IS
BEGIN
O_RET_CODE:=0;
O_RET_MSG:='初始化默认成功';
IF I_ID IS NOT NULL THEN
UPDATE Test_User SET NAME=I_NAME,
AGE =I_AGE
WHERE ID= I_ID;
COMMIT;
O_RET_CODE:=0;
O_RET_MSG:='操作成功';
ELSE
O_RET_CODE:=1;
O_RET_MSG:='没有ID';
END IF;
EXCEPTION
WHEN OTHERS THEN
O_RET_CODE:=-1;
O_RET_MSG:='sql执行过程出错啦!';
END Upd_Test_User;
PROCEDURE Del_Test_User(I_ID IN VARCHAR2,
O_RET_CODE OUT NUMBER,
O_RET_MSG OUT VARCHAR2)IS
BEGIN
NULL;
END Del_Test_User;
PROCEDURE Que_Test_User(I_ID IN VARCHAR2,
I_NAME IN VARCHAR2,
I_AGE IN VARCHAR2,
O_RET_CODE OUT NUMBER,
O_RET_MSG OUT VARCHAR2,
O_RET_LIST OUT SYS_REFCURSOR)IS
T_SQL VARCHAR2(200):='';
U Test_User%rowtype;
BEGIN
NULL;
IF I_NAME IS NOT NULL THEN
T_SQL := T_SQL || 'AND T.NAME = ''' || I_NAME || '''';
END IF;
IF I_AGE IS NOT NULL THEN
T_SQL := I_AGE || 'AND T.AGE = ''' || I_AGE || '''';
END IF;
T_SQL := 'SELECT T.ID,T.NAME,T.AGE FROM Test_User T WHERE 1=1'|| T_SQL ;
OPEN O_RET_LIST FOR T_SQL;
loop
fetch O_RET_LIST into U.id, U.name,U.age;
exit when O_RET_LIST%notfound;
dbms_output.put_line(U.id||'-'||U.name||'-'||U.age);
end loop;
END Que_Test_User;
PROCEDURE Que_Page_Test_User(I_ID IN VARCHAR2,
I_NAME IN VARCHAR2,
I_AGE IN VARCHAR2,
I_PAGE_SIZE IN NUMBER,
I_PAGE_NUM IN NUMBER,
O_RET_CODE OUT NUMBER,
O_RET_MSG OUT VARCHAR2,
O_RET_TOTNUM OUT NUMBER,
O_RET_LIST OUT SYS_REFCURSOR)IS
O_Q_SQL VARCHAR2(200):='';
O_T_SQL VARCHAR2(200):='';
I_PRA VARCHAR2(200):='';
BEGIN_ROW NUMBER :=0;
END_ROW NUMBER :=I_PAGE_SIZE;
BEGIN
O_RET_CODE:=0;
O_RET_MSG:='初始化默认成功';
IF I_PAGE_SIZE IS NOT NULL AND I_PAGE_NUM IS NOT NULL THEN
BEGIN_ROW := (I_PAGE_NUM-1)*I_PAGE_SIZE+1;
END_ROW := I_PAGE_NUM *I_PAGE_SIZE ;
IF I_NAME IS NOT NULL THEN
I_PRA := I_PRA || 'AND T.NAME LIKE ''%' || I_NAME || '%''';
END IF;
IF I_AGE IS NOT NULL THEN
I_PRA := I_PRA || 'AND T.AGE = ''' || I_AGE || '''';
END IF;
O_Q_SQL := 'SELECT T.ID,T.NAME,T.AGE FROM (SELECT ROWNUM RN ,TE.* FROM Test_User TE WHERE ROWNUM <='|| END_ROW ||') T WHERE T.RN >= '|| BEGIN_ROW || I_PRA ;
OPEN O_RET_LIST FOR O_Q_SQL;
O_T_SQL := 'SELECT COUNT(ID) AS TOTNUM FROM Test_User WHERE 1=1'|| I_PRA ;
DBMS_OUTPUT.put_line(O_T_SQL);
O_RET_CODE:=0;
O_RET_MSG:='操作成功';
ELSE
O_RET_CODE:=1;
O_RET_MSG:='没有页码详情';
END IF;
DBMS_OUTPUT.put_line(O_T_SQL);
DBMS_OUTPUT.put_line(O_RET_MSG);
EXCEPTION
WHEN OTHERS THEN
O_RET_CODE:=-1;
O_RET_MSG:='sql执行过程出错啦!';
END Que_Page_Test_User;
end Pro_Test_User;
3.存储语句写完后在执行一个左上角的“设置”按钮。
4.查看packages和package bodies下是否有生成的存储过程
调用(一):
declare
I_ID VARCHAR2(10);
I_NAME VARCHAR2(10);
I_AGE VARCHAR2(10);
O_RET_CODE NUMBER;
O_RET_MSG VARCHAR2(10);
p_ref1 SYS_REFCURSOR;
result_ SYS_REFCURSOR;
begin
Pro_Test_User.Que_Test_User(I_ID,I_NAME,I_AGE,O_RET_CODE,O_RET_MSG,p_ref1);
DBMS_OUTPUT.put_line(O_RET_MSG);
end;
调用(二):
declare
I_ID VARCHAR2(10);
I_NAME VARCHAR2(10);
I_AGE VARCHAR2(10);
O_RET_CODE NUMBER;
O_RET_MSG VARCHAR2(10);
p_ref1 SYS_REFCURSOR;
result_ SYS_REFCURSOR;
begin
Pro_Test_User.Que_Test_User(I_ID,I_NAME,I_AGE,O_RET_CODE,O_RET_MSG,O_RET_LIST=>p_ref1);
loop
fetch p_ref1 into I_ID,I_NAME,I_AGE;
dbms_output.put_line(I_NAME||'------------'||I_AGE);
exit when p_ref1%notfound;
end loop;
end;
调用(三):
declare
v_cursor sys_refcursor;
ret_code NUMBER;
ret_msg VARCHAR2(10);
u Test_User%rowtype;
begin
Pro_Test_User.Que_Test_User(2,'张三','',ret_code,ret_msg,v_cursor);
loop
fetch v_cursor into u.id, u.name,u.age;
exit when v_cursor%notfound;
dbms_output.put_line(u.id||'-'||u.name||'-'||u.age);
end loop;
end;
orcale存储过程学习之路(一)的更多相关文章
- orcale存储过程学习之路--存储过程实例(三)
--创建表 create table TESTTABLE( id1 VARCHAR2(12), name VARCHAR2(32))select t.id1,t.name from TESTTA ...
- orcale存储过程学习之路--创建空存储过程(二)
--创建表 create table TESTTABLE( id1 VARCHAR2(12), name VARCHAR2(32))select t.id1,t.name from TESTTA ...
- Jfinal调用Orcale存储过程
因为项目需要,最近一直在学习Orcale存储过程,但发现在网上很少有人写Jave中Jfinal调用Orcale存储过程的文章,即使有也是几年前的,很多都不能用,今天给大家分享一段Jfinal调用Orc ...
- 微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)
首先先补习下企业库的Caching Application Block的相关知识: 1.四大缓存方式,在Caching Application Block中,主要提供以下四种保存缓存数据的途径,分别是 ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- 初级dba学习之路参考
今天周一拖着疲惫的身躯 11点才离开公司,回到家估计写完这篇博客就要17号了. 一个人走在回家的路上,很黑,突然很多感触,一个人在北京拼搏,不敢停止学习的脚步,因为只要停下来就会感觉到孤独. 回顾一下 ...
- jQuery学习之路(1)-选择器
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...
随机推荐
- Android基础知识之拼写检查框架
原文:http://android.eoe.cn/topic/android_sdk 拼写检查器框架 Android平台提供了一个拼写检查器的框架,来方便你在你的应用中实现并使用拼写检查.这个框架是A ...
- Android应用一般上架流程
Android App上架所需文件 上架准备 App文件: 1. 安装包 2. 应用商标:图片格式KB. 3. 应用截图(4~6张):图片格式JPG或者PNG.图片大小480*800,且每张大小一致 ...
- [svc]linux正则实战(grep/sed/awk)
企业实战: 过滤ip 过滤出第二行的 192.168.2.11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...
- 【Unity】9.1 导入粒子系统组件
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Unity 5.x已经自带了粒子系统组件,新建工程后只需要直接导入它就可以使用了. 二.导入Unity自带的粒子系统组件 ...
- 通过反射实现圆角ImageView
private void init(){ paint = new Paint(Paint.ANTI_ALIAS_FLAG); roundRect = , , getWidth() , getHeigh ...
- GoLang-字符串
初始化 var str string //声明一个字符串 str = "laoYu" //赋值 ch :=str[0] //获取第一个字符 len :=len(str) //字符串 ...
- Booleans
两个取值false和true.但要注意Lua中所有的值都可以作为条件.在控制结构的条件中除了false和nil为假,其他值都为真.所以Lua认为0和空串都是真.
- [转]Web App 框架选择之百度&腾讯
百度的GMU GMU(Global Mobile UI)是百度前端通用组开发的移动端组件库,GMU是基于zepto的mobile UI组件库,提供webapp.pad端简单易用的UI组件.具有代码体积 ...
- 【FastDFS】FastDFS在CentOS的搭建
准备安装软件 [root@blog third_package]# cp fastdfs-nginx-module_v1.16.tar.gz FastDFS_v5.08.tar.gz libfastc ...
- vue2.0的contextmenu右键菜单
1.事情对象 <!DOCTYPE html> <html> <head> <title></title> <meta charset= ...