设为首页 加入收藏

TOP

Oracle技术_5分钟会用存储过程_存储过程简单实例(包含循环、条件、增改查、参数传入、变量赋值、java调用等)(二)
2014-11-23 17:51:10 】 浏览:507
Tags:Oracle 技术 分钟 存储 过程 简单 实例 包含 循环 条件 参数 传入 变量 java 调用
EST_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);
执行后,表结构及数据结果如图:
\

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("连接字符串", "用户名", "密码");
CallableStatement proc = null;
proc = conn.prepareCall("{ call PROCEDURE_TEST( , ) }");
proc.setString(1, "T01");
proc.setString(2, "test@mail.com");
proc.execute();

执行结果如下图,DBMS控制台打印的: \

两个被更新的表:
\
点击进入ooppookid的博客
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle数据库的连接 下一篇DB2日志文件归档脚本db2uext2的ba..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目