PL/SQL中如何让程序每隔几秒插入一条数据
admin
2023-05-09 20:21:49
0次

在编写ORACLE PL/SQL中,如果需要程序执行中暂停几秒钟再继续执行,可以通过oracle内置的dbms_lock.sleep来实现,不过dbms_lock包需要用户自己安装。

[root@oraclevm ~]# su - oracle

[oracle@oraclevm ~]$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.4.0 Production on Mon May 25 16:36:12 2015


Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> startup    


SQL> @?/rdbms/admin/dbmslock.sql


Package created.


Synonym created.


Grant succeeded.


SQL> grant execute on dbms_lock to public; --授权PUBLIC执行权限  

  

Grant succeeded.  

  

SQL> create table test1(id number,name varchar2(40),time date);   --创建test1临时表  

  

Table created.  

  

SQL> select * from test1;  --无数据  

  

no rows selected    

  

SQL> SET TIMING ON     --打开时间显示  

SQL> begin             --开始执行测试脚本  

  2    insert into test1(id,name,time) values(1,'Andy',sysdate);  

  3    DBMS_LOCK.SLEEP(10);  --让程序暂时10秒钟  

  4    insert into test1(id,name,time) values(2,'Shirley',sysdate);  

  5    commit;  

  6  end;  

  7  /  

  

PL/SQL procedure successfully completed.  

  

Elapsed: 00:00:10.04  --程序执行时间为10.04秒  

  

  

SQL> SELECT ID,NAME,TO_CHAR(TIME,'YYYY/MM/DD HH24:MI:SS') AS TIME FROM TEST1; 

--查询执行结果  

  

        ID NAME                           TIME  

---------- -------------------------   -----------------  

         1 Andy                        2014/12/10 10:09:03   --第一条的插入时间是09:03  

         2 Shirley                     2014/12/10 10:09:13   --第二条的插入时间是09:13

刚好比第一条晚了10秒钟    

  

SQL> drop table test1;  

  

Table dropped.  


下面给个例子:

每隔一秒插入一条数据

vi /tmp/11.sh

#/bin/sh

su - oracle <

sqlplus / as sysdba <

drop table test;

drop sequence test_seq;

create table test (id int,hostname varchar2(50),datetime date);

create sequence test_seq

minvalue 1

maxvalue 100000

start with 1

increment by 1

cache 20;

declare

maxrecords constant int:=100000;

i int :=1;

begin

for i in 1..maxrecords loop

insert into test

(id,hostname,datetime)

values

(test_seq.nextval,'oraclevm',sysdate);

commit;

dbms_lock.sleep(1);

end loop;

end;

/

exit;

EOF


[root@oraclevm ~]#chmod 755 /tmp/11.sh

[root@oraclevm ~]#cd /tmp

[root@oraclevm ~]#./11.sh

即可执行。


先设置一下时间格式

export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"


最后进行数据查询

spool /tmp/test_oracle

set linesize 80

col hostname format a8;

set colsep' ';

set pagesize 0;


SQL> select id,hostname,to_char(datetime,'YYYY-MM-DD HH24:MI:SS') from test;

         1 oraclevm 2014-12-27 10:19:09

         2 oraclevm 2014-12-27 10:19:10

         3 oraclevm 2014-12-27 10:19:11

         4 oraclevm 2014-12-27 10:19:12

         5 oraclevm 2014-12-27 10:19:13

         6 oraclevm 2014-12-27 10:19:14

         7 oraclevm 2014-12-27 10:19:15

         8 oraclevm 2014-12-27 10:19:16

         9 oraclevm 2014-12-27 10:19:17

        10 oraclevm 2014-12-27 10:19:18

        


spool用法:

spool是Oracle SQL*PLUS下的命令,可以用它来导出表中的大量数据,生成格式可以由自己手动控制。

1. 编写spool.sql脚本,存放在/tmp目录下

set trimspool on 
set linesize 120 
set pagesize 2000 
set newpage 1 
set heading off 
set term off 
set echo off
set feedback off
spool /tmp/data.txt 
select deptno || ',' || dname || ',' || loc from dept;
spool off


2. 在sql*plus上用scott用户登录,执行上面的sql脚本

!/tmp/spool.sql(linux下)

@d:\spool.sql(windows下)


3.观察相应目录,生成了data.txt文件,txt中的内容如下:

10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON

总结:

利用spool可以方便地导出所需要的表,进而可以利用导出的数据进行不同数据库间的数据迁移。

下面介绍使用spool的一些常用设置:

set colsep ' ';    //域输出分隔符 
set echo off;    //显示start启动的脚本中的每个sql命令,缺省为on 
set feedback off;  //回显本次sql命令处理的记录条数,缺省为on 
set heading off;   //输出域标题,缺省为on 
set pagesize 0;   //输出每页行数,缺省为24,为了避免分页,可设定为0。 
set termout off;   //显示脚本中的命令的执行结果,缺省为on(可以缩写为term)
set trimout on;   //去除标准输出每行的拖尾空格,缺省为off 
set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off 


注意:

如果直接在sql*plus中执行上面的spool.sql命令,而不通过执行脚本来进行,那么在生成的txt文件中会存在执行的sql语句。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...