pl/sql之package

程序包规范:

CREATE [OR REPLACE] PACKAGE package_name IS|AS
	[Public item declarations]
	[Subprogram specification]
END [package_name];

程序包主体:

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
	[Private item declarations]
	[Subprogram bodies]
[BEGIN
Initialization]
END [package_name];

程序包中的游标:

游标的定义分为游标规范和游标主体两部分;
在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型;
RETURN子句指定的数据类型可以是:
    1, 用 %ROWTYPE 属性引用表定义的记录类型
    2, 程序员定义的记录类型,例如 TYPE EMPRECTYP IS RECORD(emp_id INTEGER,salary REAL)来定义的。
    3, 不可以是number, varchar2, %TYPE等类型。

例:

SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS
		 CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS 
			SELECT * FROM order_master WHERE VENCODE=vcode;
		 PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE;
		 BEGIN
			 OPEN ord_cur(vcode); 
			 LOOP
				 FETCH ord_cur INTO or_rec;
				 EXIT WHEN ord_cur%NOTFOUND;
				 DBMS_OUTPUT.PUT_LIne(’返回的值为' || or_rec.orderno);
			 END LOOP;
		 END ord_pro;
	 END cur_pack;
	 /

USER_OBJECTS :视图包含用户创建的子程序和程序包的信息

SELECT object_name, object_type
FROM USER_OBJECTS
WHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');

USER_SOURCE :视图存储子程序和程序包的源代码

SELECT line, text 
FROM USER_SOURCE
WHERE NAME='TEST'; --注意大写

ORACLE内置程序包:

程序包名称说明
STANDARD和DBMS_STANDARD定义和扩展PL/SQL语言环境
DBMS_LOB提供对 LOB数据类型进行操作的功能
DBMS_OUTPUT处理PL/SQL块和子程序输出调试信息
DBMS_RANDOM提供随机数生成器
DBMS_SQL允许用户使用动态 SQL
DBMS_XMLDOM用DOM模型读写XML类型的数据
DBMS_XMLPARSERXML解析,处理XML文档内容和结构
DBMS_XMLQUERY提供将数据转换为 XML 类型的功能
DBMS_XSLPROCESSOR提供XSLT功能,转换XML文档
UTL_FILE用 PL/SQL 程序来读写操作系统文本文件

例:

SQL> SET SERVEROUTPUT ON
SQL> BEGIN
		 DBMS_OUTPUT.PUT_LINE('打印三角形');
		 FOR i IN 1..9 LOOP
			 FOR j IN 1..i LOOP
				DBMS_OUTPUT.PUT('*');
			 END LOOP for_j;
			 DBMS_OUTPUT.NEW_LINE;
		 END LOOP for_i;
	 END;
	 /

例:chr(10) 换行符,

select instr('helloworld','l') from dual; --返回结果:3    默认第一次出现“l”的位置
select instr('helloworld','lo') from dual; --返回结果:4    即:在“lo”中,“l”开始出现的位置
select instr('helloworld','wo') from dual; --返回结果:6    即“w”开始出现的位置

格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串)
格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )   /   instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。

SQL> DECLARE
		 result CLOB;
		 xmlstr VARCHAR2(32767);
		 line   VARCHAR2(2000);
		 line_no INTEGER := 1;
	 BEGIN
		 result := DBMS_XMLQUERY.GETXML('SELECT empno, ename FROM employee');
		 xmlstr := DBMS_LOB.SUBSTR(result,32767);
		 LOOP
			 EXIT WHEN xmlstr IS NULL;
			 line := SUBSTR( xmlstr, 1 , INSTR( xmlstr, CHR(10)) - 1 );
			 DBMS_OUTPUT.PUT_LINE(line_no || ':' || line);
			 xmlstr := SUBSTR( xmlstr, INSTR( xmlstr, CHR(10)) + 1);
			 line_no := line_no + 1;
		 END LOOP;
	 END;
	 /

例: DBMS_RANDOM 包可用来生成随机整数

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
		 v_random  NUMBER;
		 counter   NUMBER;
	 BEGIN
		 counter := 1;
		 WHILE counter <= 10 LOOP
			 v_random := DBMS_RANDOM.RANDOM;
			 DBMS_OUTPUT.PUT_LINE(v_random);
			 counter := counter + 1;
		 END LOOP;
	 END;
	 /

`UTL_FILE` 包用于读写操作系统文本文件,操作文件的一般过程是打开、读或写、关闭,UTL_FILE 包指定文件路径依赖于 DIRECTORY 对象
SQL> CREATE DIRECTORY TEST_DIR AS 'C:\DEVELOP';
SQL> GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT;
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
		 input_file   UTL_FILE.FILE_TYPE;
		 input_buffer VARCHAR2(4000);
	 BEGIN
		 input_file := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'r');
		 LOOP
			 UTL_FILE.GET_LINE(input_file,input_buffer);
			 DBMS_OUTPUT.PUT_LINE(input_buffer);
		 END LOOP;
		 UTL_FILE.FCLOSE(input_file);
		 
		 EXCEPTION
			 WHEN
				NO_DATA_FOUND 
			 THEN
				DBMS_OUTPUT.PUT_LINE('------------------');
	 END;
	 /

DBMS_JOB包的用法

包含以下子过程:
BROKEN()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job 、broken与next_date。
CHANGE()过程用来改变指定工作的设置。这个过程有四个参数:job、what 、next_date与interval。
INTERVAL()过程用来显式地设置重执行一个工作之间的时间间隔数。
ISUBMIT()过程用来用特定的工作号提交一个工作.
NEXT_DATE()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:job与next_date。
REMOVE()过程来删除一个已计划运行的工作。这个过程接收一个参数。
RUN()过程用来立即执行一个指定的工作。这个过程只接收一个参数。
SUBMIT()过程,工作被正常地计划好。
USER_EXPORT()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。
WHAT()过程应许在工作执行时重新设置此正在运行的命令。

创建测试表

create table test_job(insert_time date);

创建一个自定义过程

create or replace procedure test_pro as
begin
	insert into test_job values(sysdate);
end;
/

创建JOB

variable job1 number;
begin
	dbms_job.submit(:job1,'test_pro;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
end;

运行JOB

begin
	dbms_job.run(:job1);
end;

检查结果

select to_char(insert_time,'yyyy/mm/dd hh24:mi:ss') 时间 from test_job; 

删除JOB

begin
	dbms_job.remove(:job1);
end;
/

–查看job下次执行时间以及间隔时间
select * from dba_jobs where job = '774';

–启动job
exec dbms_job.run(774);

–停用job
exec dbms_job.broken(job#,true);
exec dbms_job.broken(774, true);

–查看当前用户下面有多少job执行
select job,what,failures,broken from user_jobs where job = '774' ;

–查看正在运行的job
select * from dba_jobs_running where job = '774';


产生一个9位的随机整数:
SELECT DBMS_RANDOM.RANDOM FROM DUAL;

产生一个100以内的随机整数:
SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;

VALUE函数会返回一个大于等于0但是小于1的数:
SELECT DBMS_RANDOM.VALUE FROM DUAL;

对于指定范围内的整数,要加入参数low_value和high_value,并从结果中截取小数(最大值不能被作为可能的值),产生一个0到99之间的小数:
SELECT DBMS_RANDOM.VALUE(0, 100) FROM DUAL;

产生0到99之间的整数:
SELECT TRUNC(DBMS_RANDOM.VALUE(0, 100)) FROM DUAL;

STRING函数生成随机文本字符串,可以指定字符串的类型和所希望的长度:
SELECT DBMS_RANDOM.STRING('A', 20) FROM DUAL;

下面是一些类型的代码:
'U'用来生成大写字符,
'L'用来生成小写字符,
'A'用来生成大小写混合的字符,
'P'表示字符串由任意可打印字符构成,
'X'表示字符串由大写字符和数字构成。

返回某年内的随机日期,分两步:

1) 
 SELECT TO_CHAR(TO_DATE('01/01/03','mm/dd/yy'),'J') 
 FROM DUAL; 
2) 
 SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),'J') 
 FROM DUAL; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值