存储过程是一组为了完成特定功能的sql语句集,存储在数据库中,经过一次编译后再次调用不需要编译。用户通过指定存储过程的名字来执行它。

  基本语法:

    create or replace procedure  procedure_01

    is//一直纠结这里是is还是as,查资料后发现:在存储过程(procedure)和函数(function)中没有区别。在视图(view)中只能用as不能用is,在游标(cursor)中只能用is,不能用as。

    begin

     //要执行的代码行

    commit;

    end  procedure_01;

    

  调用存储过程:

  call   procedure_01();//注意括号不可省略。创建的时候不用加,调用的时候必需加上。

  

  *前两天公司给安排了一个任务,要求写一个存储过程,循环遍历所有表,找出所有业务已经完成的记录,即status='11'的记录插入到历史表中,并删除原表中的记录。

  记录下来,方便日后查询。历史表与原表的区别就是多了‘_H’。

  create or replace procedure insertH

  is

  begin

    insert into TW_ZNDW_TASK_MAIN_H select * from TW_ZNDW_TAKS_MAIN where status='11';

    delete from TW_ZNDW_TAKS_MAIN T where status = '11' and EXISTS(select 1 from TW_ZNDW_TASK_MAIN_H H where T.id = H.id);

    //exists是判断后面的sql语句是否为真,若为真则整个sql句子成立,否则没有任何记录。这句话的意思就是在删除原表记录之前先判断一下是否已经插入到了历史表中

    //有时候为了提高效率,只是测试下某个表中是否存在记录,就用1来代替。

  commit;

  end insertH;

  call insertH();

  //上述代码只是插入一张表的记录。后面查了资料,学习了怎么循环遍历所有表,接下来分享完整代码。

  create or replace procedure insertHistory

  is

    tableName1  varchar2(100);

    tableName2  varchar2(100);

    sqlstr        varchar2(500);

      cursor   tableNameAll is Select table_name FROM USER_TABLES where regexp_like(table_name,'^TW_ZNDW_TASK_[0-9]+$') or table_name = 'TW_ZNDW_TASK';

    //游标cursor,这里只能用is来赋值。USER_TABLES是系统表,使用USER_TABLES可查询所有的table_name字段。

  begin

    for tableName in tableNameAll loop

      begin

        tableName1 := tableName.table_name;//这里赋值用:=冒号加等号的形式赋值,tableName是形参,用来获取table_name赋值给tableName1;

        tableName2 := tableName1+'_H';

        sqlstr := 'insert into' || tableName2 || 'select * from' || tableName1 || 'where status='' 11'' ';//连接符号用||,也可以用+。

        EXECUTE IMMEDIATE sqlstr;  //表示立即执行该语句。

        sqlstr := 'delete from' tableName1 || 'where status=''11'' and exists (select 1 from' || tableName2 || 't2 where t1.id = t2.id'  )';

        EXECUTE IMMEDIATE sqlstr;

        commit;

      end;

    end loop;

  end insertHistory;

调用:call insertHistory();

*另外一个任务,初始化部分数据。之所以把这个任务放在这里,是因为这是优化之后的代码,刚接手这个任务的时候我是一条一条记录来插入删除的,后来请教了组长才明白这么回事,可以动态执行。感觉跟存储过程有异曲同工之妙。

  

--删除历史数据
DELETE from TW_PROD_ELEC_RULE_CONFIG where RULE_TYPE='退服指标自动稽核算法';
--插入移动数据
INSERT INTO TW_PROD_ELEC_RULE_CONFIG
select
rawtohex(sys_guid()), o.ORGCODE, o.ORGNAME, NULL, NULL, NULL, NULL, '剔除免责站址数据,剔除夜间免责,未购买发电服务站址停电保够3小时的退服不纳入统计,运营商申告工单', '剔除免责站址数据 ,剔除夜间免责 ,未购买发电服务站址停电保够3小时的退服不纳入统计 ,运营商申告工单', '2', 'sa', sysdate, NULL, NULL, NULL, NULL, NULL, NULL, '退服指标自动稽核算法', '1001'
from BAF_ORG_ORGANIZATION o
where OBJECTTYPEID='3'
and (
o.ORGNAME like '%四川%'
or o.ORGNAME like '%河南%'
or o.ORGNAME like '%江苏%'
);
INSERT INTO TW_PROD_ELEC_RULE_CONFIG
select
rawtohex(sys_guid())as id,P_ORGID,P_ORGNAME,C_ORGID,C_ORGNAME,A_ORGID,A_ORGNAME,RULE_INFO,RULE_INFO_TEXT,STATUS,CREATE_USER,CREATE_DATE,
UPDATE_DATE,UPDATE_USER,COL1,COL2,COL3,RULE_COL_CHECK,RULE_TYPE,'1002' RETIREMENT_SCOPE
from TW_PROD_ELEC_RULE_CONFIG where RULE_TYPE='退服指标自动稽核算法'
UNION
select
rawtohex(sys_guid())as id,P_ORGID,P_ORGNAME,C_ORGID,C_ORGNAME,A_ORGID,A_ORGNAME,RULE_INFO,RULE_INFO_TEXT,STATUS,CREATE_USER,CREATE_DATE,
UPDATE_DATE,UPDATE_USER,COL1,COL2,COL3,RULE_COL_CHECK,RULE_TYPE,'1003' RETIREMENT_SCOPE
from TW_PROD_ELEC_RULE_CONFIG where RULE_TYPE='退服指标自动稽核算法';

*补充:

//union 和 union all都要求两个sql查询列要相同;
//union:联合查询出并集(会去除重复记录);
//union all:联合查询出并集,包含重复记录;

【oracle笔记4】存储过程的更多相关文章

  1. Oracle笔记 目录索引

    Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Or ...

  2. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...

  3. Dapper完美兼容Oracle,执行存储过程,并返回结果集。

    Dapper完美兼容Oracle,执行存储过程,并返回结果集. 这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合 ...

  4. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  5. Oracle job procedure 存储过程定时任务

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  6. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  7. oracle 中的存储过程

      oracle 中的存储过程 --oracle 中的存储过程, --不带任何参数的 CREATE OR REPLACE PROCEDURE PRO_TEST AS -- AS 和is 没有任何区别 ...

  8. 【转】Oracle job procedure 存储过程定时任务

    原文:Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相 ...

  9. Oracle笔记(1) 简单查询、限定查询、数据的排序

    Oracle笔记(四) 简单查询.限定查询.数据的排序   一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...

  10. oracle函数和存储过程有什么区别

    oracle函数和存储过程有什么区别 1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数 ...

随机推荐

  1. mysql 查询近几天的结果 按每天的粒度查询

    ),DATE_FORMAT(FROM_UNIXTIME(createtime), '%Y-%m-%d') as time from bskuser group by time

  2. es6 import笔记

    export输出: // profile.js var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export ...

  3. type="button"和type="submit"的区别

    type="button" ,"submit" 的区别(转) Submit是专门用于提交表单的Button,与Button的区别主要有两点: type=button 就单纯是按钮功能   type=s ...

  4. 纯js轮播图

    <div id="wrapper"> <div id="container"> <img src="http://ima ...

  5. font-size 基准

    浏览器的缺省字体为16px: 你可以先将基准字体大小设置为10px; body  { font-size: 62.5%; } 然后统一使用 em作为单位 div { font-size: 2.4em; ...

  6. P4python: python interface to Perforce API

    P4python is the python interface to Perforce API, it helps to do Perforce operations through python. ...

  7. 自动下载和安装 MNIST 到 TensorFlow 的 python 源码 (转)

    # Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 ...

  8. CXPACKET等待事件

    今天收到数据库预警,发现连接数较多.于是立马登录查看机器的基本情况: select * from sys.sysprocesses 查看了一下连接数,发现有两个进程都处于CXPACKET状态,而且看得 ...

  9. 使用js时,如何获取系统当前时间并且得到格式为"yyyy年MM月"的日期

    1.使用js时,如何获取系统当前时间并且得到格式为"yyyy年MM月"的日期: 1 var newdate = new Date(); 2 var nowyear = newdat ...

  10. JQuery里ajax的表单传值serialize()用法

          本文导读:在jQuery中,当我们使用ajax时,常常需要拼装 input数据以键值对(Key/Value)的形式发送到服务器,用JQuery的serialize方法可以轻松的完成这个工作 ...