基础技术:

样例业务功能:

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. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  2. BZOJ 4810 莫队+bitset

    思路: 看完这道题根本没有思路啊.... 然后我就膜拜了一波题解... 这神tm乱搞思路 维护两个bitset 第一个bitset代表当前区间哪些数出现过 第二个bitset是 maxp-p出现过 差 ...

  3. span标签对于margin-top,margin-bottom无效,但是margin-left,margin-right却是有效的。

    首先,span是行内元素,是没有宽高的. 我们来做个简单的布局 <div> <span>内容内容内容内容内容内容内容内容</span> </div> 页 ...

  4. 关于基础的Set 和Get

    先附上一篇文章,讲的很清楚 在Core中,我们要是先这样设置了.在我们对这个上下文做查询工作的时候,例如: var head = _OMSECDatabase.OmsEcorderHead.Where ...

  5. vs2015网站部署到iis后运行调试:无法在web服务器上启动调试的问题,403已禁止

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files C:\Windows\Microsoft.NET\Frame ...

  6. MatLab之HDL coder

    1 Workflow The workflow for applying HDL code generation to the hardware design process requires the ...

  7. SQL Server之存储过程

    存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它 ...

  8. Swift Method Dispatching — a summary of my talk at Swift Warsaw

    Swift Method Dispatching When announcing Swift, Apple described it as being much faster than Objecti ...

  9. The as! Operator

    Prior to Swift 1.2, the as operator could be used to carry out two different kinds of conversion, de ...

  10. Linux 重要文件目录

    文件系统层次化标准(Filesystem Hierarchy Standard)[FHS] 树形结构 /boot 开机所需文件——内核开机菜单以及所需的配置文件等 /dev 以文件形式存放任何设备与接 ...