设为首页 收藏本站
查看: 310|回复: 0

[经验分享] PL/SQL中如何让程序每隔几秒插入一条数据

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-5-26 08:39:07 | 显示全部楼层 |阅读模式
在编写ORACLE PL/SQL中,如果需要程序执行中暂停几秒钟再继续执行,可以通过oracle内置的dbms_lock.sleep来实现,不过dbms_lock包需要用户自己安装。
[iyunv@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 <<EOF
sqlplus / as sysdba <<EOF
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

[iyunv@oraclevm ~]#chmod 755 /tmp/11.sh
[iyunv@oraclevm ~]#cd /tmp
[iyunv@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;

select to_char(datetime,'YYYY-MM-DD HH24:MI:SS') from test where hostname='hostname' order by id;

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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-70714-1-1.html 上篇帖子: Oracle函数之单列合并函数WM_CONCAT问题记录 下篇帖子: ORA-28001: the password has expired 程序 如何
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表