PL/SQL程序单元
来源:互联网 发布:ica加权自相关算法 编辑:程序博客网 时间:2024/05/18 02:22
PL/SQL程序单元:
- 是数据库中命名的PL/SQL块,作为数据库对象保存在数据库里。
- 主要有四类:
- 过程:执行特定操作,无返回值。有点像Java中的方法,无返回值。
- 函数:进行复杂计算,有返回值。有点像Java中的方法,有返回值。
- 包:逻辑上相关的过程和函数组织在一起。有点Java中类的感觉。
- 触发器:事件触发,执行相应的操作。
存储过程介绍:
- 参数模式:
- IN:默认值,如果不写,就是IN。值被传递给子程序。子程序不能改变参数值,是从外部传入的。
- OUT:如果想用,必须显示的指定出来,子程序会改变参数的值。
- IN OUT:如果想用,必须显示的指定出来,子程序可以改变也可以不改变。
存储过程的快速入门:
- 无参的存储过程:我是用的工具是PL/SQL Developer。创建存储过程如下:在开发工具的左边有一个
- 点击右键出现:
- 这个时候就会出现你输入名称的存储过程了,只不过是空的:也就是is,begin后面没有东西。
/**第一个存储过程,向tab_stu插入一条数据**/create or replace procedure firstPro --is相当于前面的declare在is后面写申明变量is v_stu_age number:=23;begin insert into tab_stu(stu_id,stu_name,stu_age,class_id) values(5,'德玛',v_stu_age,3); commit;end firstPro;
- 输入上面的内容,编译器左上角的小齿轮。如果编译成功在第一个图的下有一个绿色的图标,它就是存储过程。
- 如果要执行存储过程,选中编译好的存储过程,右键有一个“测试”选择,如果没有参数的直接运行就行,如果有参数会在下面提示输入参数。选中在运行那个小齿轮就行。
带参数的存储过程:
- 带参数的存储过程,定义如下:
/**带参数的存储过程**/create or replace procedure paramPro(--默认是输入参数v_stu_id varchar2,v_stu_name varchar2,v_stu_age number,v_class_id number) isbegin insert into tab_stu(stu_id,stu_name,stu_age,class_id) values(v_stu_id,v_stu_name,v_stu_age,v_class_id); commit;end paramPro;
定时备份的存储过程:
- 下面来写一个每隔多长时间,就备份一次的存储过程。
- 先写一个备份的存储过程:
/**存储过程更多情况下是在数据库方做数据整合等复杂的工作需求:每天在规定时间需要备份tab_stu表的数据思路:1.备份上一次没有备份的数据。2.这个时候就需要有一个id来存储上次备份到那3.备份完后,需要修改id的值。4.还需要有一个备份表**/create or replace procedure backPro(--上次备份最后的idmax_id number) is--用游标来存储,需要备份的数据cursor c_tab_stu is select * from tab_stu where stu_id>max_id;--定义rowtyper_tab_stu tab_stu%rowtype;--存储备份后的最大id的值v_max_id number;--索引值v_index number:=0;begin if c_tab_stu%isopen then null; else open c_tab_stu; end if; --循环备份 loop fetch c_tab_stu into r_tab_stu; exit when c_tab_stu%notfound; insert into tab_stu_back(stu_id,stu_name,stu_age,class_id) values(r_tab_stu.stu_id,r_tab_stu.stu_name,r_tab_stu.stu_age,r_tab_stu.class_id); /** 下面这样写因为: 1.如果数据量很大的话,一次性提交或插入一条提交一次。都是不好的。 1.1.一次性提交,因为Oracle是将回滚段存到内存中的,如果数据量很大内存会出现问题。 1.2.如果插入一条提交一次,上面的问题没有了。但是性能非常的差 2.这里就让它每插入2000条就提交一次。 3.这里记得归零。 **/ if v_index>2000 then commit; v_index:=0; else v_index:=v_index+1; end if; end loop; commit; close c_tab_stu; --修改tab_max_id的max_id的值为备份表中的最大id的值 select max(stu_id) into v_max_id from tab_stu_back; update tab_max_id set max_id=v_max_id; commit;end backPro;
- 在创建一个调用存储过程的存储过程:
--通过一个存储过程调用另一存储过程create or replace procedure invockParamisv_max_id number;begin select max_id into v_max_id from tab_max_id; --调用backpro存储过程 backpro(v_max_id); end invockParam;
这里只要执行上面的存储过程就能备份了。 - 下面是怎么实现自动备份。
--创建调度任务定时器declare jobno number;--这个可以随便定义begin sys.dbms_job.submit(jobno, what => 'invockParam;', --invockParam为存储过程的名称 Interval =>'TRUNC(sysdate,''mi'')+1/(24*60)' --定义时间间隔每分钟 ); commit;end;
上面的定时也可以通过PL/SQL developer创建,还是左边的选择DBMS_Jobs右键新建,在弹出窗口中,查看sql。输入上面的内容就行。通过小齿轮运行。 - 关于定义时间间隔问题,可以通过搜索“pl/sql创建调度任务定时器”。有很多非常好的文章介绍。
- PL/SQL程序单元
- PL/SQL程序单元
- 程序包调用报ORA-06508: PL/SQL: 无法找到正在调用的程序单元
- 程序包报错 ORA-06508: PL/SQL: 无法找到正在调用的程序单元
- PL/SQL基础(2):单元
- Oracle Web ADI 加载时错误:ORA-06508: PL/SQL: 无法在调用之前找到程序单元
- PL/SQL程序块
- PL/SQL程序(一)
- 什么是PL/SQL程序
- PL/SQL 程序块
- PL/SQL 程序
- pl/sql程序块
- PL/SQL Developer 插件程序
- PL/SQL程序設計
- PL/SQL程序之光标
- PL/SQL程序之例外
- PL/SQL程序之触发器
- 如何编写 PL/SQL 程序
- about wiener filter theory
- iscenery
- 初学者学数据结构(三)
- SpriteKit碰撞检测
- STM32系列芯片命名规则
- PL/SQL程序单元
- printk的使用-日志等级
- java--I/O流概述
- java--InputStream,OutStream
- java文件流的处理
- HDOJ 4239 - Decoding EDSAC Data 模拟
- java过滤流
- asp.net的微软报表无法打印的解决。
- DNS原理及解析过程分析