ORACLE进阶(八)存储过程案例详解_orcale进阶(八),前端开发基础培训

91 阅读4分钟

ES6

  • 列举常用的ES6特性:

  • 箭头函数需要注意哪些地方?

  • let、const、var

  • 拓展:var方式定义的变量有什么样的bug?

  • Set数据结构

  • 拓展:数组去重的方法

  • 箭头函数this的指向。

  • 手写ES6 class继承。

微信小程序

  • 简单描述一下微信小程序的相关文件类型?

  • 你是怎么封装微信小程序的数据请求?

  • 有哪些参数传值的方法?

  • 你使用过哪些方法,来提高微信小程序的应用速度?

  • 小程序和原生App哪个好?

  • 简述微信小程序原理?

  • 分析微信小程序的优劣势

  • 怎么解决小程序的异步请求问题?

开源分享:docs.qq.com/doc/DSmRnRG…

一、前言

2017.7.12入职以来,自己处于不断学习状态。在工作过程中,积累工作经验十分重要。尤其是一些业务知识自己需要不断充电。之前接到一个写批量小程序的任务,由于自己之前并未接触过Oracle,更别提什么PL/SQL,存储过程了,自己刚开始也是不知道从何处着手,但接到了任务,自己也只能硬着头皮上了,要不然呢?!

首先需要了解存储过程是什么?如何在PL/SQL中执行?存储过程、函数、包之间的关系是怎样的?

有关存储过程的学习,请参考博文《ORACLE进阶(七)存储过程详解》。

下面结合实际应用场景,讲解下存储过程的具体应用。

二、需求

利用存储过程实现:从CDEPDP表中获取旧机构号,然后依据旧机构号查表CDETRADEEX_BAK,获取到新机构号,并把新机构号后缀到旧机构号之后。

三、思路

  1. 从CDEPDP表中获取旧机构号字符串,形式为“1K7040,1K7090,1K7019”;然后利用正则表达式组装成数组形式;

  2. 依据旧机构号查表CDETRADEEX_BAK,获取到新机构号;

  3. 把新机构号后缀到旧机构号之后。

SPERIOD

CREATE OR REPLACE PROCEDURE SPERIOD IS

  /\* 创建游标cur\_CDEPDP,用于提取CDEPDP中的trades数据 \*/
  Cursor cur_CDEPDP IS
    SELECT TRADES FROM CDEPDP;

  v_count      NUMBER;
  v_sum        NUMBER;
  loop_counter NUMBER;
  v_sum2       NUMBER;
  v_result     CDEPDP.TRADES%TYPE;
  oldOrg_var   CDEPDP.TRADES%TYPE;
  oldOrg       CDETRADEEX_BAK.OLDTRADENO%TYPE;
  invalid_old_orgno EXCEPTION;
BEGIN
  v_count      := 0;
  v_sum        := 0;
  v_sum2       := 0;
  loop_counter := 1;
  /\* 使用游标for循环,按行获取CDEPDP中的数据 \*/
  FOR trades in cur_CDEPDP LOOP
    v_result := '';
    DBMS_OUTPUT.PUT_LINE('oldOrg Items:' || trades.trades);
    oldOrg_var := trades.trades;
    v_count    := v_count + 1;
    v_sum      := REGEXP_COUNT(oldOrg_var, ',') + 1;
    DBMS_OUTPUT.PUT_LINE('Total Items:' || v_sum);
    /\* 若只存在一个数据元素 \*/
    IF v_sum < 2 THEN
      DBMS_OUTPUT.PUT_LINE(RETRIEVEORGNO(oldOrg_var));
      DBMS_OUTPUT.PUT_LINE('Result:' || oldOrg_var || ',' ||
                           RETRIEVEORGNO(oldOrg_var));
    ELSE
      FOR loop_counter IN 1 .. v_sum LOOP
        oldOrg := LTRIM(RTRIM(REGEXP_SUBSTR(oldOrg_var,
                                            '[^,]+',
                                            1,
                                            loop_counter),
                              ','),
                        ' ');
        --DBMS\_OUTPUT.PUT\_LINE(oldOrg);
        --DBMS\_OUTPUT.PUT\_LINE(RETRIEVEORGNO(oldOrg));
        IF RETRIEVEORGNO(oldOrg) IS NOT NULL THEN
          /\* 去重并拼接结果(新机构号) \*/
          IF REGEXP_LIKE(v_result, RETRIEVEORGNO(oldOrg)) THEN
            CONTINUE;
          ELSE
            v_result := v_result || ',' || RETRIEVEORGNO(oldOrg);
          END IF;
          /\* ELSE RAISE invalid\_old\_orgno; CONTINUE; \*/
        END IF;
      END LOOP;
      /\* 拼接结果(旧机构号 + 新机构号) \*/
      v_result := oldOrg_var || ',' || LTRIM(v_result, ',');
      DBMS_OUTPUT.PUT_LINE('Result:' || v_result);
      v_sum2 := REGEXP_COUNT(v_result, ',') + 1;
      DBMS_OUTPUT.PUT_LINE('Total Items After Processed:' || v_sum2);
    END IF;
  END LOOP;
  /\* 输出测试信息 \*/
  DBMS_OUTPUT.PUT_LINE('Sum Items:' || v_count);
  /\* 异常捕捉-数据信息不存在 \*/
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('数据库中不存在新机构号对应该旧机构号');
  WHEN invalid_old_orgno THEN
    DBMS_OUTPUT.PUT_LINE('数据库中不存在新机构号对应该旧机构号2');
END SPERIOD;

RETRIEVEORGNO

create or replace function RETRIEVEORGNO(oldOrg IN CDETRADEEX_BAK.OLDTRADENO%TYPE)
  return CDETRADEEX_BAK.NEWTRADENO%TYPE is
  return_value CDETRADEEX_BAK.NEWTRADENO%TYPE;
begin
  SELECT NEWTRADENO INTO return_value FROM CDETRADEEX_BAK WHERE OLDTRADENO = oldOrg;
  /\*DBMS\_OUTPUT.PUT\_LINE('return\_value:' || return\_value);\*/
  return(return_value);
  /\* 当旧机构号不存在对应的新机构号 \*/
EXCEPTION
  WHEN NO_DATA_FOUND
    THEN RETURN NULL;
end RETRIEVEORGNO;

select \* from CDETRADEEX_BAK;
select \* from cdepdp;

四、遇到的问题

  1. 正则表达式;

  2. 正确表示两数值相等使用“ =”;

  3. 包、存储过程、函数之间的关系?如何相互调用?

五、优化

在存储过程中新增传参,为达到模块化开发,更合理的方式是在入参中定义OUT参数,其他模块在调用时可直接使用处理结果。在获取到新参数后,新增更新表结构语句。
SPERIOD

CREATE OR REPLACE PROCEDURE SPERIOD_CDEPDP(p_BeginFlag IN VARCHAR2) IS

  /\* 创建游标cur\_CDEPDP,用于提取CDEPDP中的trades数据 \*/
  Cursor cur_CDEPDP IS
    SELECT pdid, trades FROM CDEPDP;

  v_sum        NUMBER;
  v_sumnew     NUMBER;
  loop_counter NUMBER;
  v_result     CDEPDP.TRADES%TYPE;
  v_trades     CDEPDP.TRADES%TYPE;
  v_pdid       CDEPDP.PDID%TYPE;
  v_oldOrg     CDETRADE.TRADENO%TYPE;
  v_newOrg     CDETRADE.TRADENO%TYPE;

  invalid_old_orgno EXCEPTION;
BEGIN
  IF p_BeginFlag = 'TRUE' THEN
    v_sum        := 0;
    v_sumnew     := 0;
    loop_counter := 1;
    /\* 使用游标for循环,按行获取CDEPDP中的数据 \*/
    FOR curloop in cur_CDEPDP LOOP
      v_pdid   := curloop.pdid;
      v_trades := curloop.trades;
      v_result := v_trades;
      IF v_trades IS NULL THEN
        CONTINUE;
      ELSE
        v_sum := REGEXP_COUNT(v_trades, ',') + 1;
        --DBMS\_OUTPUT.PUT\_LINE('pdId:' || v\_pdid);


**TCP协议**

- TCP 和 UDP 的区别?
- TCP 三次握手的过程?
- 为什么是三次而不是两次、四次?
- 三次握手过程中可以携带数据么?
- 说说 TCP 四次挥手的过程
- 为什么是四次挥手而不是三次?
- 半连接队列和 SYN Flood 攻击的关系
- 如何应对 SYN Flood 攻击?
- 介绍一下 TCP 报文头部的字段
- TCP 快速打开的原理(TFO)
- 说说TCP报文中时间戳的作用?
- TCP 的超时重传时间是如何计算的?
- TCP 的流量控制
- TCP 的拥塞控制
- 说说 Nagle 算法和延迟确认?
- 如何理解 TCP 的 keep-alive?

![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7c5c4434f4c34e828748d3e3a4484dd9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321581&x-signature=YAGYnx0bNJ4NR%2B2gSK%2Fbgg3UvGo%3D)

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://docs.qq.com/doc/DSmRnRGxvUkxTREhO)**

#### 浏览器篇

- 浏览器缓存?
- 说一说浏览器的本地存储?各自优劣如何?
- 说一说从输入URL到页面呈现发生了什么?
- 谈谈你对重绘和回流的理解
- XSS攻击
- CSRF攻击
- HTTPS为什么让数据传输更安全?
- 实现事件的防抖和节流?
- 实现图片懒加载?

![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c8e7651164f342aeb94b6b624fa812d2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321581&x-signature=z9URWJI2tLIuJVY%2B3H%2Fs4kFQw4I%3D)