pl/sql培训练习题(一)

2014-11-24 09:58:11 · 作者: · 浏览: 1

1、 写一个存储过程,向表中随机插入1000条记录

SerialNo:使用序列方式,自增长。

Filepath:使用随机插入6个字母

Partid: 使用随机4位数字

StaffNo:从YTCZ060001……. YTCZ060020 中随机抽取

RecordTime:从2011年8月1日之前的6个月中随机抽取。

2、写一个程序块,循环调用500次此存储过程,保证数据表中存储50万条记录。

3、写一个存储过程,删除3个月前的数据。

4、写一个job,每隔30天凌晨2点整,系统执行“删除3个月前数据”的存储过程。

--下面的结果仅供参考:

(SerialNo:使用序列方式,自增长。)

1.创建一个序列

-- Create sequence

create sequence seq_class

minvalue 1

maxvalue 100000000000

start with 201101

increment by 1

cache 20;

.序列的使用

select seq_class.nextval from dual; --使用下个值

select seq_class.currval from dual; --使用当前值

.删除序列

drop SEQUENCE seq_class;

2.录音表:

create table recordfile(

SerialNo VARCHAR2(200) primary key,

FilePath VARCHAR2(400),

Partid Varchar2(40),

StaffNo VARCHAR2(100),

RecordTime DATE

);

3.存储过程,向表中随机插入1000条记录

create or replace procedure p_random_corder

is

MAXRECORDS CONSTANT INT :=1000;

I INT :=2;

BEGIN

FOR I IN 2..MAXRECORDS LOOP

insert into recordfile(serialno,filepath,partid,staffno,recordtime)

values('2011'||seq_class.nextval,

upper(chr(trunc(dbms_random.value(97,122))))||

upper(chr(trunc(dbms_random.value(97,122))))||

upper(chr(trunc(dbms_random.value(97,122))))||

upper(chr(trunc(dbms_random.value(97,122))))||

upper(chr(trunc(dbms_random.value(97,122))))||

upper(chr(trunc(dbms_random.value(97,122)))),

'YTCZ'||trunc(dbms_random.value(60001,60020)),

floor(abs(trunc(dbms_random.value(1000,9999)))) ,

to_date('2011-0'||

case when trunc(dbms_random.value(2,8))=2 then '2'||'-'||floor(abs(trunc(dbms_random.value(1,28))))

when trunc(dbms_random.value(2,8))=3 then '3'||'-'||floor(abs(trunc(dbms_random.value(1,31))))

when trunc(dbms_random.value(2,8))=4 then '4'||'-'||floor(abs(trunc(dbms_random.value(1,30))))

when trunc(dbms_random.value(2,8))=5 then '5'||'-'||floor(abs(trunc(dbms_random.value(1,31))))

when trunc(dbms_random.value(2,8))=6 then '6'||'-'||floor(abs(trunc(dbms_random.value(1,30))))

when trunc(dbms_random.value(2,8))=7 then '7'||'-'||floor(abs(trunc(dbms_random.value(1,31))))

end,'yyyy-mm-dd')

) ;

END LOOP;

DBMS_OUTPUT.PUT_LINE('成功插入记录');

commit;

END;

/

4、 写一个程序块,循环调用500次此存储过程,保证数据表中存储50万条记录。

set serveroutput on ;

declare

--i integer;

begin

--i := 1;

for i in 1..500 loop

p_random_corder;

--commit;

end loop;

dbms_output.put_line('循环调用500次此存储过程');

end;

/

5、 写一个存储过程,删除3个月前的数据。

create or replace procedure p_delete_threedata

is

begin

delete from recordfile where RecordTime = trunc(add_months(sysdate,-3));

commit;

exception

when others then

rollback;

end ;

/

6、写一个job,每隔30天凌晨2点整,执行删除数据的存储过程。

DECLARE

JobNum NUMBER(5) := 0;

JobID NUMBER(5);

BEGIN

SELECT COUNT(*) INTO JobNum FROM DBA_JOBS WHERE UPPER(SUBSTRB(WHAT,1,30)) = UPPER('p_delete_threedata');

IF JobNum > 0 THEN

SELECT NVL(JOB,0) INTO JobID FROM DBA_JOBS WHERE UPPER(SUBSTRB(WHAT,1,30)) = UPPER('p_delete_threedata');

IF JobID > 0 THEN

DBMS_JOB.REMOVE(JobID);

END IF;

END IF;

DBMS_JOB.SUBMIT(JobID, 'p_dele