基础技术:

样例业务功能:

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="">


两个被更新的表:




点击进入ooppookid的博客

数据库技术_Orcale技术(0002)_5分钟会用存储过程_存储过程实例的更多相关文章

  1. 20151028整理罗列某种开发所包括对技术(技术栈),“较为全面”地表述各种技术大系的图表:系统开发技术栈图、Web前端技术栈图、数据库技术栈图、.NET技术栈图

    ———————————— 我的软件开发生涯 (10年开发经验总结和爆栈人生) 爆栈人生 现在流行说全栈.每种开发都有其相关的技术.您是否觉得难以罗列某种开发所包括对技术(技术栈)呢?   您是否想过: ...

  2. (转)Oracle与DB2在数据库高可用技术上的相同与差异探讨

    原文:http://www.talkwithtrend.com/Article/178339 数据库建设过程中,高可用是每一个企业数据中心数据库建设过程中至关重要的一个关注点,直接关系到业务连续性和稳 ...

  3. React实战之将数据库返回的时间转换为几分钟前、几小时前、几天前的形式。

    React实战之将数据库返回的时间转换为几分钟前.几小时前.几天前的形式. 不知道大家的时间格式是什么样子的,我先展示下我这里数据库返回的时间格式 ‘2019-05-05T15:52:19Z’ 是这个 ...

  4. mysql数据库之 存储引擎、事务、视图、触发器、存储过程、函数、流程控制、数据库备份

    目录 一.存储引擎 1.什么是存储引擎? 2.mysql支持的存储引擎 3. 使用存储引擎 二.事务 三.视图 1.什么是视图 2.为什么要用视图 3.如何用视图 四.触发器 为何要用触发器 创建触发 ...

  5. [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器

    本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...

  6. 安装SQL数据库时遇到问题。需要更新以前的visual studio 2010实例

    安装SQL数据库时遇到问题.需要更新以前的visual studio 2010实例此计算机安装了需要service pack 1更新的visual 2010,必须安装此更新才能成功安装选择的SQL s ...

  7. 【SQL Server复制】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?

    转自:https://www.cnblogs.com/happyday56/p/3849018.html 关键字:sql server复制 [SQL Server高可用性]数据库复制:修改表结构.新增 ...

  8. 后端技术杂谈11:十分钟理解Kubernetes核心概念

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...

  9. mysql数据库的优化技术

    表的设计合理化(遵从3NF)<3范式> 1NF:表的列具有原子性,不可再分解(列的信息不能分解,只要是关系型的数据库就自动满足1NF) 2NF:表中的记录是唯一的,就满足2NF(通常我们设 ...

随机推荐

  1. JNI学习积累之一 ---- 常用函数大全

    主要资料来源: 百度文库的<JNI常用函数> . 同时对其加以了补充 . 要素  :1. 该函数大全是基于C语言方式的,对于C++方式可以直接转换 ,例如,对于生成一个jstring类型的 ...

  2. Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook解决方法

    有时候电脑中进行Java -version相关的操作时,会出现Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook提示信息,尽管这些提示信息不影响JDK的正常使 ...

  3. 企业级分布式监控系统--zabbix

    目录 1.Zabbix简介 2.zabbix安装 3.工作原理 4.监控功能 5.监控系统架构 6.Zabbix系统架构 7.Zabbix组件构成 8.zabbix监控环境中基本概念 正文 回到顶部 ...

  4. 使用MALTAB标定实践记录

    记录一下整个相机的标定矫正过程,希望能够帮助到刚学习标定的童鞋们- 首先下载matlab calibration toolbox,百度搜索第一条就是了(http://www.vision.caltec ...

  5. 树莓派-基于raspistill实现定时拍照

    raspistill 经过上一篇<<树莓派-安装摄像头模块>>之后 raspistill 是树莓派基于摄像头拍照命令 比如我要截取一张宽1024px,高768px,旋转180度 ...

  6. 联想VIBE Shot(Z90-7/全网通) 解锁BootLoader

    工具下载链接: http://pan.baidu.com/s/1dF7zGTb 备用下载链接: http://pan.baidu.com/s/1i4UHP4L 本篇教程教你如何傻瓜式解锁BootLoa ...

  7. Leetcode0005--Longest Palindromic Substring 最长回文串

    [转载请注明]http://www.cnblogs.com/igoslly/p/8726771.html 来看一下题目: Given a string s, find the longest pali ...

  8. ie8及其以下版本兼容性问题之响应式

    解决办法:引入Respond.js让IE6-8支持CSS3 Media Query 使用方式 参考官方demo:http://scottjehl.github.com/Respond/test/tes ...

  9. Percona Xtrabackup备份及恢复

    1. http://www.percona.com/software/percona-xtrabackup下载并安装 2. 全量备份  a.全量备份到制定目录            innobacku ...

  10. Spring 团队开源 nohttp,尽可能不用 HTTP

    Spring 团队开源 nohttp 项目,用以查找.替换和阻止 http:// 的使用. 项目是为了在可能使用 https:// 的情况下不使用到 http://,确保不会发生中间人攻击.Sprin ...