PL SQL中如何讓程式每隔幾秒插入一條資料

2021-09-03 04:08:35 字數 4261 閱讀 6259

在編寫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

connected to:

oracle database 11g enterprise edition release 11.2.0.4.0 - 64bit production

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 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語句。

vue如何實現輪詢,每隔幾秒請求一次

業務場景 某個業務號經過繳費之後,會生成乙個保單號,我們需要每隔幾秒請求一次拿到保單號 在此場景中,因為保單號是需要第三方平台確認收到賬款之後才返回的,而且是乙個乙個單號返回的,當我們選擇n條資料進行操作的時候,我們就必須每隔幾秒請求一次,直到我們拿到的保單號和我們請求的資料條數相同時,停止請求 話...

如何讓plsql連線64位oracle資料庫

plsql只是32位的,如何操作64的資料庫,方法如下 3.然後找到oracle安裝目錄中的network admin tnsnames.ora檔案,將network admin tnsnames.ora資料夾結構及檔案都複製到instantclient basic win32解壓縮的資料夾之中 4...

如何讓plsql查詢的資料可編輯

plsql允許查詢資料可以編輯的條件是必須查詢出rowid 在某個表上點選query data 出現的sql語句是 select from licence t 在某個表上點選 edit data 出現的sql語句是 select t.t.rowid from licence t 說明要編輯必須帶有r...