系统包
DBMS_JOB
DBMS_JOB 是数据库中用于创建和管理自动化任务的工具,主要用于调度定时任务,如数据备份、维护、数据抽取等操作。
说明
以下是关于 DBMS_JOB 的详细说明:
任务创建
通过DBMS_JOB.SUBMIT过程创建新的任务,指定要执行的PL/SQL 代码、存储过程或 SQL语句以及任务的执行时间和频率。
DBMS_JOB.SUBMIT (
job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE DEFAULT SYSDATE,
interval IN VARCHAR2 DEFAULT ‘null’,
no_parse IN BOOLEAN DEFAULT FALSE,
instance IN BINARY_INTEGER DEFAULT any_instance,
force IN BOOLEAN DEFAULT FALSE);
以下为DBMS_JOB.SUBMIT参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| what | 要运行的作业的 PL/SQL 文本。 |
| next_date | 运行作业的下一个日期。 |
| interval | 计算下次运行作业的日期算法。默认为NULL。这必须计算为未来某个时间点或NULL。 |
| no_parse | 参数兼容。 |
| instance | 参数兼容。 |
| force | 参数兼容。 |
任务修改
使用DBMS_JOB.CHANGE过程修改已存在的任务的执行时间、间隔或内容。
DBMS_JOB.CHANGE (
job IN BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE,
interval IN VARCHAR2,
instance IN BINARY_INTEGER DEFAULT NULL,
force IN BOOLEAN DEFAULT FALSE);
以下为DBMS_JOB.CHANGE参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| what | 要运行的 PL/SQL 过程。 |
| next_date | 运行作业的下一个日期。 |
| interval | 计算下次运行作业的日期算法。 |
| instance | 参数兼容。 |
| force | 参数兼容。 |
调度内容修改
通过DBMS_JOB.WHAT过程修改要执行的PL/SQL 代码、存储过程或 SQL语句。
DBMS_JOB.WHAT (
job IN BINARY_INTEGER,
what IN VARCHAR2);
以下为DBMS_JOB.WHAT参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| what | 要运行的 PL/SQL 过程。 |
任务运行
通过DBMS_JOB.RUN过程立即运行作业JOB。
DBMS_JOB.RUN (
job IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
以下为DBMS_JOB.RUN参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| force | 参数兼容 |
任务停止
通过DBMS_JOB.BROKEN过程来停止执行的JOB。
DBMS_JOB.BROKEN (
job IN BINARY_INTEGER,
broken IN BOOLEAN,
next_date IN DATE DEFAULT SYSDATE);
以下为DBMS_JOB.BROKEN参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| broken | 将作业设置为中断或不中断。TRUE将其设置为中断;FALSE将其设置为不中断。 |
| next_date | 运行作业的下一个日期。 |
间隔修改
通过DBMS_JOB.INTERVAL过程来更改作业的运行频率。
DBMS_JOB.INTERVAL (
job IN BINARY_INTEGER,
interval IN VARCHAR2);
以下为DBMS_JOB.INTERVAL参数说明:
| 参数 | 描述 |
| Job | 正在运行的作业 ID。 |
| interval | 计算下次运行作业的日期算法。 |
调度时间修改
通过DBMS_JOB.NEXT_DATE过程来修改下次作业自动运行的时间。
DBMS_JOB.NEXT_DATE (
job IN BINARY_INTEGER,
next_date IN DATE DEFAULT SYSDATE);
以下为DBMS_JOB.NEXT_DATE参数说明:
| 参数 | 描述 |
|---|---|
| Job | 正在运行的作业 ID。 |
| next_date | 运行作业的下一个日期。 |
任务删除
通过DBMS_JOB.REMOVE过程删除不再需要的任务。
DBMS_JOB.REMOVE (
job IN BINARY_INTEGER );
以下为DBMS_JOB.REMOVE参数说明:
| 参数 | 描述 |
|---|---|
| Job | 正在运行的作业 ID。 |
任务导出
通过DBMS_JOB.USER_EXPORT过程导出JOB。
DBMS_JOB.USER_EXPORT (
job IN BINARY_INTEGER,
mycall IN OUT VARCHAR2);
以下为DBMS_JOB.USER_EXPORT参数说明:
| 参数 | 描述 |
|---|---|
| job | 正在运行的作业 ID。 |
| mycall | 重新创建给定作业的调用文本。 |
| myinst | 用于更改实例相关性的调用文本。 |
任务监控
通过查询DBA_JOBS和DBA_JOBS_RUNNING视图,可以查看任务的详细信息和运行状态,详见系统视图章节。
日历语法格式关键字及描述
FREQ:指定了重复的类型。必须指定它。指定频率值为YEARLY, MONTHLY, DAILY, HOURLY,MINUTELY,SECONDLY。
INTERVAL:指定一个正整数,表示重复频率。默认为1,最大值为99。
BYMONTH:指定希望执行作业的月份。可以使用数字,例如1代表一月,3代表三月,以及三个字母的缩写,例如FEB代表二月,JUL代表七月。
BYMONTHDAY:指定月份中的日期数字。有效值为1到 31。例如10,表示所选月份的第10天。可以使用减号 (-) 从最后一天开始倒数,例如,BYMONTHDAY=-1表示该月的最后一天,BYMONTHDAY=-2表示该月的倒数第二天。
BYHOUR:指定作业运行的时。有效值为0到23。
BYMINUTE:指定作业运行的分。有效值为0到59。
BYSECOND:指定作业运行的秒。有效值为0到59。
限制
本功能需要集成pgagent插件进行使用。
示例
--首先启动pgagent
pgagent hostaddr=127.0.0.1 dbname=highgo user=highgo port=1521 -s /opt/apps/highgo/hgdb-enterprise-9.0.3/data_oracle/hgdb_log/pgagent_log.log -t 1
-- 在psql中创建job并返回jobid
-- 该job会执行对应存储过程pro_sync
-- 每天的次日凌晨 2 点
declare jobid integer;
begin
dbms_job.submit(jobid,’pro_sync;’,’2025-03-24 02:00:00’,’trunc(sysdate)+26.0/(24)’);
end;
/
DBMS_OUTPUT
DBMS_OUTPUT包在V9.0.5及以后的版本中支持。
DBMS_OUTPUT包主要用于在函数、存储过程、包的调试或打印信息。
DBMS_OUTPUT包中共包括如下7个存储过程,分别控制DBMS_OUTPUT包功能的开启/关闭、维护和检索DBMS_OUTPUT缓存空间。同时支持在交互式终端PSQL中设置客户端变量serveroutput(参见SERVEROUTPUT)来控制是否显示输出。
| 子程序 | 描述 |
|---|---|
| lENABLE | 启用消息输出 |
| lDISABLE | 禁止消息输出 |
| lGET_LINE | 从缓冲区检索一行 |
| lGET_LINES(与Oracle存在差异) | 从缓冲区检索多行 |
| lNEW_LINE | 终止使用 PUT 创建的行 |
| lPUT | 在缓冲区放置部分行内容 |
| lPUT_LINE | 将行放置在缓冲区 |
ENABLE
此过程会启用对 PUT 、 PUT_LINE 、 NEW_LINE 、 GET_LINE 和 GET_LINES
调用。
如果不执行ENABLE,默认情况下,DBMS_OUTPUT系统包功能是禁用的。当你使用PSQL中的
SET SERVEROUTPUT 选项时,没有必要调用此过程。
语法:
DBMS_OUTPUT.ENABLE (buffer_size IN INTEGER DEFAULT 20000);
参数:
- buffer_size:可选参数,设置缓冲区的最大值(以字节为单位),将buffer_size设置为NULL表示没有限制,默认值为20000,最大值为1000000,最小值为2000。
说明:
多次调用ENABLE时,buffer_size以最后一次为准。
buffer_size参数在指定其值时分为两种情况:NULL和非NULL。当非NULL时,指定的值小于最小值2000,则buffer_size=2000;如果指定的值大于最大值1000000,则buffer_size=1000000。当buffer_size为NULL时不限制内存的使用,但是我们并不希望无节制的消耗物理内存,所以当buffer_size=
NULL时我们实现为等价于buffer_size约等于1GB,实际会略小于1GB。
示例
drop table tb;
create table tb(c1 varchar2(10),c2 int);
begin
dbms_output.enable;
dbms_output.put_line('line1');
declare
v_line varchar2(100);
v_status integer;
begin
dbms_output.get_line(v_line, v_status);
insert into tb values(v_line,v_status);
end;
end;
/
查看表数据如下,表示成功在缓冲区中插入数据并获取:
select * from tb;
c1 | c2
-------+----
line1 | 0
(1 行记录)
DISABLE
此过程关闭DBMS_OUTPUT包的PUT、PUT_LINE、NEW_LINE、GET_LINE和GET_LINES存储过程对消息缓存的使用,当关闭时应用程序调用这些接口不会产生任何影响。该过程还会清除缓冲区中所有剩余信息,刷新缓存为空。
语法:
DBMS_OUTPUT.DISABLE;
当客户端设置了SERVEROUTPUT时,不建议调用此存储过程,因为这会影响客户端的显示。
示例
drop table tb;
create table tb(c1 varchar2(10),c2 int);
begin
dbms_output.disable;
dbms_output.put_line('line1');
declare
v_line varchar2(100);
v_status integer;
begin
dbms_output.get_line(v_line, v_status);
insert into tb values(v_line,v_status);
end;
end;
/
查看表数据如下,说明缓冲区数据为空:
select * from tb;
c1 | c2
----+----
| 1
(1 行记录)
GET_LINE
此过程会从buffer中获取一行信息,获取之后,buffer中该行信息会被删除。
语法:
DBMS_OUTPUT.GET_LINE (
line OUT VARCHAR2,
status OUT INTEGER);
参数:
line:返回缓存的一行信息,不包括末尾的换行符。
status:执行结果的状态,成功获取一行返回0,否则返回1。
说明:
单行的最大值是32767字节,如果line变量长度小于实际行则会触发错误。
在调用GET_LINE或GET_LINES之后,在下一次调用
PUT、PUT_LINE或NEW_LINE之前未检索到的任何行都会被丢弃,以避免与下一条消息混淆。
示例
begin
dbms_output.enable;
dbms_output.put_line('line1');
dbms_output.put_line('line2');
declare
v_line char(4000);
v_status number:=0;
begin
dbms_output.get_line(v_line, v_status);
dbms_output.put_line(v_line);
end;
end;
/
输出:
line1
PL/iSQL procedure successfully completed.
GET_LINES
此过程会从buffer中获取一行或多行信息,获取之后,buffer中该信息会被删除。
语法:
DBMS_OUTPUT.GET_LINES (
lines OUT TEXT[],
numlines IN OUT INTEGER);
参数:
line:从缓冲区中返回的多行数组。
numlines:从缓冲区中检索的行数。
说明:
在Oracle中,lines的类型为CHARARR或者DBMSOUTPUT_LINESARRAY,目前V9暂不支持这两种类型,所以用text[]代替。此处是与Oracle的DBMS_OUTPUT不兼容的地方。
在调用GET_LINE或GET_LINES之后,在下一次调用
PUT、PUT_LINE或NEW_LINE之前未检索到的任何行都会被丢弃,以避免与下一条消息混淆。
示例
declare
v_lines text[];
v_numlines number := 100;
begin
dbms_output.enable(1000000);
dbms_output.put_line('line1');
dbms_output.put_line('line2');
dbms_output.get_lines(v_lines, v_numlines);
for i in 1..v_numlines loop
if v_lines[i] is not null then
dbms_output.put_line(v_lines[i]);
end if;
end loop;
end;
/
输出:
line1
line2
PL/iSQL procedure successfully completed.
NEW_LINE
该过程向缓冲区添加一个换行符,产生新的一行。
语法:
DBMS_OUTPUT.NEW_LINE;
说明:
添加一个换行符,缓冲区中的行以此作为分隔符。
GET_LINE和GET_LINES不会返回未以换行符结尾的行。
调用此过程时,如果之前已经调用过GET_LINE和GET_LINES并且缓存不为空,则丢弃其内容刷新缓存。
示例
执行如下语句,输出的line1和line2在一行中:
begin
dbms_output.enable(40000);
dbms_output.put('line1');
dbms_output.put_line('line2');
end;
/
--输出
line1line2
PL/iSQL procedure successfully completed.
使用new_line之后:
begin
dbms_output.enable(40000);
dbms_output.put('line1');
dbms_output.new_line;
dbms_output.put_line('line2');
end;
/
--输出
line1
line2
PL/iSQL procedure successfully completed.
PUT
该过程将在buffer中的最后一行追加指定内容。
语法:
DBMS_OUTPUT.PUT (item IN VARCHAR2);
参数:
- item:要缓存的部分行的内容。
说明:
此过程将部分行放入缓冲区中。
与PUT_LINE不同,PUT过程不会自动在末尾追加一个换行符,因此多与NEW_LINE一起使用。
调用此过程时,如果之前已经调用过GET_LINE和GET_LINES并且缓存不为空,则丢弃其内容刷新缓存。
示例
SET SERVEROUTPUT ON;
BEGIN
-- 使用 PUT 输出不换行的内容
DBMS_OUTPUT.PUT('Hello, ');
DBMS_OUTPUT.PUT('this is ');
DBMS_OUTPUT.PUT('a single ');
DBMS_OUTPUT.PUT('line.');
DBMS_OUTPUT.PUT_LINE('Hello!');
END;
/
输出:
Hello, this is a single line.Hello!
PL/iSQL procedure successfully completed.
PUT_LINE
该过程用来向buffer中增加一行新信息。
语法:
DBMS_OUTPUT.PUT_LINE (item IN VARCHAR2);
参数:
- item:要缓存的整行的内容。
说明:
自动在末尾追加换行符。
使用PUT和PUT_LINE创建的输出消息是被缓存起来的,直到程序执行完才检索其输出。
调用此过程时,如果之前已经调用过GET_LINE和GET_LINES并且缓存不为空,则丢弃其内容刷新缓存。
示例
-- 启用输出显示
SET SERVEROUTPUT ON;
BEGIN
-- 直接输出文本
DBMS_OUTPUT.PUT_LINE('Hello, Highgo!');
-- 输出变量值
DECLARE
v_name VARCHAR2(20) := 'World';
v_date DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, ' || v_name || '!');
DBMS_OUTPUT.PUT_LINE('Today is: ' || TO_CHAR(v_date,
'YYYY-MM-DD'));
END;
END;
/
结果如下:
Hello, Highgo!
Hello, World!
Today is: 2025-09-01
PL/iSQL procedure successfully completed.