存储过程是一组为了完成特定功能的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. javascript判断一个元素是另外一个元素的子元素

    javascript判断一个元素是另外一个元素的子元素用途有很多,最常用的就是当点击页面的空白处去执行某些操作,比如弹出层等. function isParent (obj,parentObj){ w ...

  2. Python入门-内置函数二

    看到标题你也能猜到今天要说大概内容是什么了,没错,昨天没有说完的部分再给大家说说(有一些重合的部分),内置函数的内容比较多,并且工作中经常用到的却不太多,很多都是不太常用的,所以我就着重说一些比较常用 ...

  3. Python基础-socket编程

    一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...

  4. windows 下进程与线程的遍历

    原文:http://www.cnblogs.com/Apersia/p/6579376.html 在Windows下进程与线程的遍历有好几种方法. 进程与线程的遍历可以使用<TlHelp.h&g ...

  5. Hadoop自定义JobTracker和NameNode管理页面

    为了可以方便地在hadoop的管理界面(namenode和jobtracker)中自定义展示项,使用代理servlet的方式实现了hadoop的管理界面. 首先, 在org.apache.hadoop ...

  6. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    今天在用idea搭建spring mvc时候报了这个错误,缺少jstl的依赖包.由于是使用的spring-core的依赖,而spring-core里面是有jstl的.这就郁闷了,最后是在自己的pom. ...

  7. Word 2010 去除文字或段落背景色

    在复制网页文本到Word时,有时会带有网页上的背景颜色.下面采用两种方法解决这种问题,可根据不同需要进行选择. 方法一:清除样式 此种方法适用于只需要网页文字,而不想要网页任何样式信息,如字体大小,段 ...

  8. Mysql 性能调优参数

    1.DEFAULT_STORAGE_ENGINE <br\>如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了.如果没有,确保把你的表转换为 ...

  9. Oracle Fusion Middleware Supported System check,jdk,java .etc requirements

    http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html 在oracle官 ...

  10. spring的声明式事务,及redis事务。

    Redis的事务功能详解 http://ghoulich.xninja.org/2016/10/12/how-to-use-transaction-in-redis/ MULTI.EXEC.DISCA ...