数据库技术_Orcale技术(0002)_5分钟会用存储过程_存储过程实例
基础技术:
样例业务功能:
1.依据传入的类型A_TYPE联合查询PROCEDURE_TEST_A表、PROCEDURE_TEST_A_SUB表中的数据。并显示主要内容。
2.依据传入的类型A_TYPE联合查询PROCEDURE_TEST_A表、PROCEDURE_TEST_A_SUB表。并将结果插入PROCEDURE_TEST_B表中。
这里若B_EMAIL字段为空则取传入的默认值。
3.若PROCEDURE_TEST_B表进行了插入操作。则分组统计ASUB_NUMBER字段更新或插入PROCEDURE_TEST_C表中。
里面包括了存储过程经常使用的大部分操作。包括循环、条件、增改查、參数传入、变量赋值等,话不多说直接上样例:
1.创建所须要的表,并初始化数据
创建4张表,当中3个表须要初始数据,代码例如以下:
--数据来源表PROCEDURE_TEST_A
CREATE TABLE PROCEDURE_TEST_A
(
A_ID VARCHAR2(255) NOT NULL,
A_USER VARCHAR2(255),
A_EMAIL VARCHAR2(255),
A_TYPE VARCHAR2(5),
CONSTRAINT PROCEDURE_TEST_A PRIMARY KEY (A_ID)
);
--数据来源表的子表PROCEDURE_TEST_A_SUB
CREATE TABLE PROCEDURE_TEST_A_SUB
(
ASUB_ID VARCHAR2(255) NOT NULL,
ASUB_NAME VARCHAR2(255),
ASUB_NUMBER NUMBER(18,2),
ASUB_COMMENT VARCHAR2(2000),
A_ID VARCHAR2(255),
CONSTRAINT PROCEDURE_TEST_A_SUB PRIMARY KEY (ASUB_ID),
CONSTRAINT PROCEDURE_TEST FOREIGN KEY (A_ID) REFERENCES PROCEDURE_TEST_A (A_ID)
);
--数据整合后插入表
CREATE TABLE PROCEDURE_TEST_B
(
B_ID VARCHAR2(255) NOT NULL,
B_USER VARCHAR2(255),
B_EMAIL VARCHAR2(255),
B_NAME VARCHAR2(255),
B_NUMBER NUMBER(18,2),
B_COMMENT VARCHAR2(2000),
CONSTRAINT PROCEDURE_TEST_B PRIMARY KEY (B_ID)
);
--数据整合后更新表
CREATE TABLE PROCEDURE_TEST_C
(
C_USER VARCHAR2(255) NOT NULL,
C_NUMBER NUMBER(18,2),
CONSTRAINT PROCEDURE_TEST_C PRIMARY KEY (C_USER)
);
--PROCEDURE_TEST_A初始化
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00006', 'system', '', 'T00');
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00001', 'popkidorc', 'popkidorc@mail.com', 'T01');
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00002', 'csdn', 'csdn@mail.com', 'T01');
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00003', 'pop', '', 'T01');
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00004', 'kid', 'kid@mail.com', 'T01');
INSERT INTO PROCEDURE_TEST_A
(A_ID, A_USER, A_EMAIL, A_TYPE)
VALUES
('AID00005', 'orc', 'orc@mail.com', 'T01');
--PROCEDURE_TEST_A_SUB初始化
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00001', 'oralce_blog', 9.90, 'oralce博客', 'AID00001');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00002', 'sql_blog', 1.50, 'sql博客', 'AID00001');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00003', 'swift_blog', 1.00, 'swift博客', 'AID00001');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00004', 'game_blog', 6.00, 'game博客', 'AID00003');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00005', 'sport_blog', 5.55, 'sport博客', 'AID00003');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00006', 'kid_blog', 99.00, 'kid博客', 'AID00004');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00007', 'zero_blog', 0.00, 'zero博客', 'AID00005');
INSERT INTO PROCEDURE_TEST_A_SUB
(ASUB_ID, ASUB_NAME, ASUB_NUMBER, ASUB_COMMENT, A_ID)
VALUES
('ASUBID00008', 'large_blog', 100000.00, 'large博客', 'AID00005');
--PROCEDURE_TEST_C初始化
INSERT INTO PROCEDURE_TEST_C
(C_USER, C_NUMBER)
VALUES
('popkidorc', 9.90);
运行后。表结构及数据结果如图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb29wcG9va2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.创建存储过程
代码例如以下,凝视很具体,直接copy就可慢慢看:
CREATE OR REPLACE PROCEDURE PROCEDURE_TEST(I_A_TYPE VARCHAR2,
I_DEFAULT_MAIL VARCHAR2) IS
--声明变量 start--
L_DEFAULT_MAIL VARCHAR2(255) := 'default@mail.com'; --声明变量。并赋值;若第二个输入參数不为空,则取该值作为MAIL字段的默认值
L_TEST_B_COUNT INTEGER; --B表更新后影响记录数
L_TEST_C_COUNT INTEGER; --C表更新后影响记录数
CURSOR A_CURSOR IS
SELECT A.A_USER, S.ASUB_NUMBER
FROM PROCEDURE_TEST_A_SUB S
LEFT JOIN PROCEDURE_TEST_A A
ON A.A_ID = S.A_ID
WHERE A.A_TYPE = I_A_TYPE; --游标对象。用来储存结果集
--声明变量 end--
BEGIN
--循环显示A表中数据 start--
FOR A_C IN A_CURSOR LOOP
DBMS_OUTPUT.PUT_LINE('===LOOP PROCEDURE_TEST_A===' || A_C.A_USER ||
'===' || A_C.ASUB_NUMBER);
END LOOP; --这里用的是FOR IN循环,WHILE循环也比較经常使用,能够去查一下
--循环显示A表中数据 end-- --查询A、A_SUB表,并插入B表 start--
INSERT INTO PROCEDURE_TEST_B
(B_ID, B_USER, B_EMAIL, B_NAME, B_NUMBER, B_COMMENT)
SELECT SYS_GUID(),
A.A_USER,
DECODE(A.A_EMAIL,
NULL,
DECODE(I_DEFAULT_MAIL,
NULL,
L_DEFAULT_MAIL,
I_DEFAULT_MAIL),
A.A_EMAIL),
S.ASUB_NAME,
S.ASUB_NUMBER,
S.ASUB_COMMENT
FROM PROCEDURE_TEST_A_SUB S
LEFT JOIN PROCEDURE_TEST_A A
ON A.A_ID = S.A_ID
WHERE A.A_TYPE = I_A_TYPE; L_TEST_B_COUNT := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('===INSERT PROCEDURE_TEST_B ROWCOUNT===' ||
L_TEST_B_COUNT); --影响的记录数,SQL%ROWCOUNT
--查询A、A_SUB表。并插入B表 end-- --更新C表 start--
IF L_TEST_B_COUNT > 0 THEN
--先推断若B表有更改才来更新C表
MERGE INTO PROCEDURE_TEST_C C
USING (SELECT A.A_USER, SUM(S.ASUB_NUMBER) AS SUM_NUMBER
FROM PROCEDURE_TEST_A_SUB S
LEFT JOIN PROCEDURE_TEST_A A
ON A.A_ID = S.A_ID
GROUP BY A.A_USER) A
ON (A.A_USER = C.C_USER)
WHEN MATCHED THEN
UPDATE SET C.C_NUMBER = A.SUM_NUMBER
WHEN NOT MATCHED THEN
INSERT VALUES (A.A_USER, A.SUM_NUMBER);
L_TEST_C_COUNT := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('===UPDATE OR INSERT PROCEDURE_TEST_C ROWCOUNT===' ||
L_TEST_C_COUNT); --影响的记录数。SQL%ROWCOUNT
END IF;
--更新C表 end-- --提交事务 start--
COMMIT; --这里慎用,最好不要直接在存储过程中提交,而是使用服务端代码手动提交。
--提交事务 end--
--异常处理 start--
EXCEPTION
--非常多异常我就不一一写出来了。常见的写两个。其它的用OTHER了
WHEN DUP_VAL_ON_INDEX THEN
--违反了唯一性限制。
DBMS_OUTPUT.PUT_LINE('===DUP_VAL_ON_INDEX EXCEPTION===');
RAISE;
WHEN NO_DATA_FOUND THEN
--SELECT时候未找到数据
DBMS_OUTPUT.PUT_LINE('===NO_DATA_FOUND EXCEPTION===');
RAISE;
--终止进程
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('===OTHERS EXCEPTION===');
RAISE;
--异常处理 end--
END PROCEDURE_TEST;
3.运行存储过程
直接运行,代码例如以下:
BEGIN
--运行存储过程
PROCEDURE_TEST('T01', 'test@mail.com');
END;
java通过thin调用。代码例如以下(关键代码):
Class.forName("数据库驱动包");
Connection conn = DriverManager.getConnection("连接字符串", "username", "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call PROCEDURE_TEST(? ,? ) }");
proc.setString(1, "T01");
proc.setString(2, "test@mail.com");
proc.execute();
运行结果例如以下图。DBMS控制台打印的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb29wcG9va2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
两个被更新的表:
数据库技术_Orcale技术(0002)_5分钟会用存储过程_存储过程实例的更多相关文章
- 20151028整理罗列某种开发所包括对技术(技术栈),“较为全面”地表述各种技术大系的图表:系统开发技术栈图、Web前端技术栈图、数据库技术栈图、.NET技术栈图
———————————— 我的软件开发生涯 (10年开发经验总结和爆栈人生) 爆栈人生 现在流行说全栈.每种开发都有其相关的技术.您是否觉得难以罗列某种开发所包括对技术(技术栈)呢? 您是否想过: ...
- (转)Oracle与DB2在数据库高可用技术上的相同与差异探讨
原文:http://www.talkwithtrend.com/Article/178339 数据库建设过程中,高可用是每一个企业数据中心数据库建设过程中至关重要的一个关注点,直接关系到业务连续性和稳 ...
- React实战之将数据库返回的时间转换为几分钟前、几小时前、几天前的形式。
React实战之将数据库返回的时间转换为几分钟前.几小时前.几天前的形式. 不知道大家的时间格式是什么样子的,我先展示下我这里数据库返回的时间格式 ‘2019-05-05T15:52:19Z’ 是这个 ...
- mysql数据库之 存储引擎、事务、视图、触发器、存储过程、函数、流程控制、数据库备份
目录 一.存储引擎 1.什么是存储引擎? 2.mysql支持的存储引擎 3. 使用存储引擎 二.事务 三.视图 1.什么是视图 2.为什么要用视图 3.如何用视图 四.触发器 为何要用触发器 创建触发 ...
- [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器
本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...
- 安装SQL数据库时遇到问题。需要更新以前的visual studio 2010实例
安装SQL数据库时遇到问题.需要更新以前的visual studio 2010实例此计算机安装了需要service pack 1更新的visual 2010,必须安装此更新才能成功安装选择的SQL s ...
- 【SQL Server复制】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?
转自:https://www.cnblogs.com/happyday56/p/3849018.html 关键字:sql server复制 [SQL Server高可用性]数据库复制:修改表结构.新增 ...
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- mysql数据库的优化技术
表的设计合理化(遵从3NF)<3范式> 1NF:表的列具有原子性,不可再分解(列的信息不能分解,只要是关系型的数据库就自动满足1NF) 2NF:表中的记录是唯一的,就满足2NF(通常我们设 ...
随机推荐
- Linux-防火墙设置-centos6.10版
cd /etc/sysconfig vi iptables 输入i进入编辑模式 打开下图,并按照下图修改 输入esc退出编辑模式 输入保存命令:[:w] 输入退出命令:[:q] 重启防火墙 servi ...
- CAS配置(3)之restful-api接入接口
第一步,cas服务端对api接口支持 在cas-server-webapp下 pom.xml添加如下依赖 <dependency> <groupId>org.jasig.cas ...
- CAS配置(1)SSL证书配置
一.配置源码 源码配置稍后提供 二.系统环境安装 安装JDK配置,版本>=1.7 环境变量配置(参考): JAVA_HOME=C:\Program Files x86)\Java\jdk1.7. ...
- BZOJ 2084 二分+hash OR Manacher
思路: 二分+哈希 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> ...
- C - Domino piling
Problem description You are given a rectangular board of M × N squares. Also you are given an unlimi ...
- File入门及路径名问题
package com.io.file; import java.io.File; /** * @author 王恒 * @datetime 2017年4月20日 下午2:53:29 * @descr ...
- Android 权限管理(持续整理)
1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...
- Beta冲刺-星期四
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 Three cobblers 这个作业的目标 完成今天的冲刺 一 ...
- android studio高德地图的显示于定位(附带逆地理编码围栏)
首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...
- javeee 字节Buffered
package Zy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io. ...