系统包

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.