存储过程是一组为了完成特定功能的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. Git Bash Here常用命令以及使用步骤

    1.首先,要clone项目代码: git clone 链接地址 2.更新代码: git pull 3.添加修改过的文件.文件夹: git add 修改过的文件,文件夹 4.提交并注释: git com ...

  2. 如何解决git fatal: refusing to merge unrelated histories

    我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法p ...

  3. tomcat本地部署正常linux服务器报404

    tomcat主页访问正常,tomcat自带的examples项目也可以访问,可自己的项目就报404,这是什么问题那? 仔细看了下 服务器webapp下面的文件,访问时候 我是访问的服务器ip/Wech ...

  4. android测试Code

    <!--android:layout_alignParentTop="true"--><com.koooke.platform.View.CenterImage ...

  5. mongodb 3.4 YUM安装

    1:配置yum源vi /etc/yum.repos.d/mongodb-org-3.4.repo加入以下内容: [mongodb-org-3.4] name=MongoDB Repository ba ...

  6. SQL 查询:查询学生平均成绩

    编程萌新,因为遇到这么个SQL 查询的问题:在一张表A里有如下字段:学生姓名.学科名.学科成绩.写一条SQL 语句查出各科平均成绩并按学生姓名分组,按如下格式显示:学生姓名|语文|数学|英语.一开始遇 ...

  7. C# Request获取URL常见用法

    如果测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPath: /testweb Request ...

  8. 【Leetcode】【Medium】Repeated DNA Sequences

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  9. Docker技术三大要点:cgroup, namespace和unionFS的理解

    www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...

  10. 连接IBM MQ原因码报2035的错误解决办法

    我们的系统使用了ibm mq,用户用来向国家局上报文件和接收文件,前几天用户说上报一直不成功.由于 开发这块程序的人已经辞职了,我觉定在我的机器部署一套,研究一下.我的思路: 在我的机器上安装mq,建 ...