PL/SQL中如何让程序每隔几秒插入一条数据

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

[[email protected] ~]# su - oracle

[[email protected] ~]$ 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

[[email protected] ~]#chmod 755 /tmp/11.sh

[[email protected] ~]#cd /tmp

[[email protected] ~]#./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语句。

时间: 2024-12-06 20:15:04

PL/SQL中如何让程序每隔几秒插入一条数据的相关文章

sql每五秒插入一条数据

1 declare @dt datetime,@today datetime,@a varchar(max),@z datetime set @a=0 2 select @today=CONVERT(varchar(100), GETDATE(), 20),@dt=@today 3 while @a<1 4 begin 5 select @today=CONVERT(varchar(100), GETDATE(), 20) 6 7 while @dt=@today 8 begin 9 inser

PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务

1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . case条件分支:等值比较.条件比较.case表达式 a.等值比较语法: CASE  条件判断 WHEN      条件值的表达式    THEN       要执行的条件操作     ; ……. [ELSE   ……..] END   CASE; b. 条件比较语法: CASE WHEN   不

ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL

3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3.1.1变量初始化时使用select into语法 select A INTO V_A INSERT INTO xxx(表)( XA)values (V_A) 3.1.2 在pl/sql语句块中使用DML a.使用oracle序列 CURR b.获取和递增序列值 CURRVAL 返回序列的当前值 NE

在PL/SQL中使用日期类型

之前的文章介绍了在PL/SQL中使用字符串和数字了下.毫无疑问,字符串和数字很重要,但是可以确定的是没有哪个应用不依赖于日期的. 你需要记录事件的发生事件,人们的出生日期等等很多. 通常的使用方式是: 1)声明日期变量和常量 2)使用内建函数显示和修改日期值 3)执行日期相关计算 日期类型比字符串或数字更复杂.它有多个部分组成(年,月,日,时,分,秒等),而且关于一个有效的日期有很多规则. 本文将给你所有信息以便在PL/SQL程序中使用日期. 1.PL/SQL中的日期,时间戳和间隔(Interv

PL/SQL(五)PL/SQL中动态执行SQL语句

在PL/SQL程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能直接在PL/SQL中执行.这些语句可以使用动态SQL来实现. PL/SQL块先编译然后再执行,动态SQL语句在编译时不能确定,只有在程序执行时把SQL语句作为字符串的形式由动态SQL命令来执行.在编译阶段SQL语句作为字符串存在,程序不会对字符串中的内容进行编译,在运行阶段再对字符串中的SQL语句进行编译和执行,动态SQL的语法是: 语法格式:动态SQL EXECUTE IMMEDIATE 动态语句

PL/SQL中SELECT总结

一.SELECT 语句的各个关键词的顺序及作用简解(这个我简略点写~) 1.SELECT 2.FROM 3.WHERE 4.GROUP BY ---对结果集进行分组,通常与聚合函数一起使用 5.HAVING 6.ORDER BY 举个例子如下: select item_name,count(item_name) from lab_item_dict where price='25' group by item_name having count(item_name)>1 order by cou

PL/SQL中自定义异常小知识

一.概念 用户定义的异常错误是通过显式使用 RAISE 语句来触发.当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码. 对于这类异常情况的处理,步骤如下 : 在PL/SQL 块的声明部分定义异常情况 :<异常情况>  EXCEPTION; RAISE <异常情况> 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理. 二.程序 --例1:使用自定义异常变量 DECLARE   v_empno emp.empno%TYPE :=&

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000

PL/SQL 下邮件发送程序

对DBA而言,尽管在os级别下发送邮件是轻而易举的事情,然而很多时候我们也需要在PL/SQL中来发送邮件,比如监控job的执行状况等.本文根据网友(源作者未考证)的代码将其改装并封装到了package,感谢这位网友的无私奉献.文章首先给出演示调用该包发送邮件的情形后面给出了完整的代码.经测试Oracle 10g,Oracle 11g下均可用.关于os下发送邮件可参考:不可或缺的 sendEmail 1.调用SENDMAIL_PKG来发送邮件 [sql] view plain copy print