Python 标准库中的 argparse 可以根据程序中的定义,从 sys.argv 中解析参数,并且自动生成帮助信息。
使用 add_argument 方法为应用程序添加参数,其中 add_argument 方法的参数比较多,这也使得 argparse 库的使用不够简洁,后续将继续为大家介绍更好用的命令行参数解析的开源库 click 。
下面是 add_argument 方法的参数及含义总结:
解析参数需要使用 ArgumentParser 实例的 parse_args 方法,此方法返回一个 NameSpace 对象;可以通过访问 NameSpace 对象属性的方式获取参数值。
下面是一个简单的例子:通过 parser.server 获取 --host 选项的值,通过 parse.boolean_switch 获取 -t 选项的值。
查看帮助信息:
参数默认值:
指定参数:
打印帮助信息:
打印版本信息:
传递参数:
② 求java命令行参数详解
作用:
当你使用命令行的形式运行.class文件时,向你的类传递参数.
C:\>java YourClassName 参数1 [参数2 参数3 ....]
参数之间用一个空格作为间隔符.
String[] args 这个字符串数组是保存运行main函数时输入的参数的,例如main函数所在的类名为test 那么你在cmd运行 java test a b c 时,args[0] = a ,args[1]=b, args[2]=c 你就可以在你的程序中调用你输入的这些变量了。
args[]不就是那个字符串This is a simple Java program吗?
-------完全不是的,你理解不对。这样好了,你在运行的时候加个参数,比如 java test XX。然后在你的main函数里面加这段话:System.out.println("arg is"+args[0]),然后看看输出是什么?
是不是这个:
This is a simple Java program
arg is XX
在运行时输入java test xx yy zz,并且在你的main函数里面加这段话:System.out.println("arg is"+args[0]+" "+args[1]+" "+args[2]),然后看看输出是什么?
是不是:
This is a simple Java program
arg is xx yy zz
现在你理解了吗。。。
如果没关系,为什么程序中去掉String args[]会出现错误?
--------之所以去掉会出错在于,不带String args[]的main函数和带String args[]的main函数,本质上已经不是同一个函数了,java 本身不存在不带String args[]的main函数,所以当然出错了。
另外,虚机团上产品团购,超级便宜
③ Python笔记:命令行参数解析
有些时候我们需要通过命令行将参数传递给脚本,C语言中有个getopt()方法,python中也有个类似的命令行参数解析方法getopt()。python也提供了比getopt()更简洁的argparse方法。另外,sys模块也可以实现简单的参数解析,本文将对这3种命令行参数解析方法简要介绍。
sys.argv是传入的参数列表,sys.argv[0]是当前python脚本的名称,sys.argv[1]表示第一个参数,以此类推。
命令行运行:
可以看到传入的参数通过sys.argv来获取,它就是一个参数列表。
python的getopt与C语言的的getopt()函数类似。相比于sys模块,支持长参数和短参数,并对参数解析赋值。但它需要结合sys模块进行参数解析,语法格式如下:
短参数为单个英文字母,如果必须赋值需要在后面加英文冒号( : ),长参数一般为字符串(相比短参数,更能说明参数含义),如果必须赋值需要在后面加等号( = )。
命令行运行:
注意:短参数(options)和长参数(long_options)不需要一一对应,可以任意顺序,也可以只有短参数或者只有长参数。
argparse模块提供了很多可以设置的参数,例如参数的默认值,帮助消息,参数的数据类型等。argparse类主要包括ArgumentParser、add_argument和parse_args三个方法。
下面介绍这三个函数的使用方法。
argparse默认提供了 -h | --help 参数:
命令行运行:
下面列出部分参数:
下面来添加参数:
命令行运行:
parse_args() 方法用于解析参数,在前面的示例代码中使用parse_args方法来提取参数值,对于无效或者错误的参数会打印错误信息和帮助信息:
命令行运行:
本文介绍了Python的三种命令行参数解析方法sys.argv、getopt和argparse,可以根据自己的需要进行选择,getopt和argparse两种方法相比来说,建议选择argparse,代码量更少更简洁。更详细的使用方法参考官方文档:
--THE END--
④ Windows批处理-for命令详解
摘自Windows XP的帮助文档。
For对一组文件中的每个文件运行指定的命令。
语法
for {%variable|%%variable} in (set) do command [ CommandLineOptions]
参数
{%variable|%%variable}
必需。代表可替换的参数。使用 %variable 通过命令提示符执行 for 命令。使用 %%variable 在批处理文件中执行 for 命令。变量要区分大小写,并且必须用 Alpha 值表示,例如,%A、%B 或 %C。
(set)
必需。指定要用指定命令处理的一个或多个文件、目录、数值范围以及文本字符串。需要括号。
command
必需。指定要对包括在指定 (set) 中的每个文件、目录、数值范围以及文本字符串所执行的命令。
CommandLineOptions
指定要通过指定命令使用的任何命令行选项。
/?
在命令提示符显示帮助。
注释
使用 for
可以在批处理文件中或直接从命令提示符使用 for 命令。
使用批处理参数
下列属性适用于 for 命令:
for 命令使用指定 set 中的每个文本字符串替换 %variable 或 %%variable,直到 command 处理所有文件为止。
记住,for variable名是区分大小写、全局的,并且每次总共不超过 52 个是活动的。
要避免批处理参数从 %0 到 %9 混淆,对 variable 可以使用除数字 0 到 9 之外的任何字符。对于简单的批处理文件,单个字符即可奏效,例如 %%f。
在复杂的批处理文件中可以使用 variable 的多个值来区分不同的可替换变量。
显示一组文件
set 参数可以代表单个或多个文件组。可以使用通配符(即,* 和 ?)指定文件组。以下为有效文件组:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
在使用 for 命令时,set 中的第一个值代替 %variable 或 %%variable,然后由指定的命令处理该值。这一直会继续下去,直到处理完与 set 值相对应的所有文件(或文件组)为止。
使用 in 和 do 关键字
In 和 do 不是参数,但必须将它们与 for 一起使用。如果省略其中任何一个关键字,就会出现错误消息。
使用 for 的其它形式
如果命令扩展名处于启用状态(即,默认设置),则支持 for 的下列其它形式:
仅为目录
如果 set 包含通配符(* 和 ?),则为匹配 set 的每个目录(而不是指定目录中的文件组)而执行指定的 command。语法是:
for /D {%% | %}variable in (set) do command [CommandLineOptions]
递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.),则只列举目录树。语法是:
for /R [[Drive :]Path] {%% | %}variable in (set) do command [CommandLineOptions]
重复数值范围
使用迭代变量设置起始值 (start#) ,然后一步步执行一系列设置范围的值,直到该值超过设置的终止值 (end#)。/L 将通过对 start# 与 end# 进行比较,执行迭代变量。如果 start# 小于 end#,就会执行该命令。如果迭代变量超过 end#,则命令解释程序退出此循环。也可以使用负 step# 以递减数值的方式一步步执行此范围内的值。例如,(1,1,5) 生成顺序 1 2 3 4 5,而 (5,-1,1) 则生成顺序 (5 4 3 2 1)。语法是:
for /L {%% | %}variable in (start#,step#,end#) do command [CommandLineOptions]
重复和文件解析
使用文件解析过程处理命令输出、字符串和文件内容。使用迭代变量定义要检查的内容或字符串,以及使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该传递为迭代程序变量。注意:在没有使用令牌选项时,/F 将仅检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容、分成独立的文本行及然后将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代程序变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。语法的不同点为:
for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}variable in ("LiteralString") do command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}variable in ('command') do command [CommandLineOptions]
filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前,每个文件都会被打开、读取和处理。要覆盖默认解析行为,指定 "ParsingKeywords"。这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项。
如果使用 usebackq 选项,请使用如下语法之一:
for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]
下表列出可以用于 ParsingKeywords 的解析关键字。
关键字 说明
eol=c 指定行尾字符(只一个字符)。
skip=n 指定在文件的开头跳过的行数。
delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。
tokens=x,y,m-n 指定将哪些令牌从每行传递到每个迭代的 for 正文。结果就分配了附加变量名称。m-n 格式是一个范围,指定从 mth 到 nth 的令牌。如果 tokens=字符串中最后一个字符是星号 (*),则将分配附加的变量,并在解析的最后一个令牌后在行上接收剩余的文本。
usebackq 指定可以使用引号引用 filenameset 中的文件名称,将后面带有引号的字符串作为一个命令执行,而带有单引号的字符串是文字字符串命令。
变量替换
已经增强了 for 变量引用的替换修改程序。下表列出可选语法(对于任意变量 I)。
带有修改程序的变量 说明
%~I 展开删除任何前后引号 ("") 的 %I。
%~fI 将 %I 展开到完全合格的路径名。
%~dI 只将 %I 展开到驱动器号。
%~pI 只将 %I 展开到路径。
%~nI 只将 %I 展开到文件名 。
%~xI 只将 %I 展开到文件扩展名。
%~sI 展开路径以只包含短名称。
%~aI 将 %I 展开到文件的文件属性。
%~tI 将 %I 展开到文件的日期和时间。
%~zI 将 %I 展开到文件大小。
%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开到第一个找到的完全合格的名称。如果没有定义环境变量名称,或搜索没有找到文件,则此修改程序扩展成空字符串。
下表列出可用来获得综合结果的修改程序组合。
变量(使用组合的修改程序) 说明
%~dpI 只将 %I 展开到驱动器号和路径。
%~nxI 只将 %I 展开到文件名和扩展名。
%~fsI 将 %I 展开到只包含短名称的完整路径名。
%~dp$PATH:I 在 PATH 环境变量中所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径。
%~ftzaI 将 %I 展开到输出行(如 dir一样)。
在上述范例中,可以用其它有效值替换 %I 和 PATH。有效的 for 变量名终止 %~ syntax。
使用大写变量名(例如 %I),可以使代码更具可读性,并且避免与不区分大小写的修改程序混淆。
解析字符串
通过将 Filenameset 包括在圆括号内,并且外面再带上单引号(即,'filenameset'),可以使用 for /F 对直接字符串解析逻辑。将 Filenameset 视为从某个文件输入的单行,然后接受解析。
解析输出
通过将圆括号之间的 filenameset 变为后面带有引号的字符串,可以利用 for /F 命令解析命令输出。将它作为命令行,此命令被传递给子 Cmd.exe,并将输出捕获到内存并进行解析,就象它是一个文件一样。
范例
要在批处理文件中使用 for,请使用以下语法:
for %%variable in (set) do command [CommandLineOptions]
要通过使用可替换变量 %f 显示当前目录中扩展名为 .doc 或 .txt 的所有文件的内容,请键入:
for %f in (*.doc *.txt) do type %f
在前述范例中,当前目录中扩展名为 .doc 或 .txt 的每个文件都被替代为变量 %f ,直到每个文件的内容都显示为止。要在批处理文件中使用该命令,只需使用 %%f 替换 %f 的每个事件。否则忽略此变量,并显示一条错误消息。
要解析文件,同时忽略注释行,请键入:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
这个命令解析 myfile.txt 文件的每一行,忽略以分号开头的行,将第二和第三个令牌从各行传递到 FOR 正文(令牌通过逗号或空格分隔)中。FOR 语句的正文引用 %i 以获得第二个令牌,引用 %j 以获得第三个令牌,引用 %k 以获得其余全部令牌。如果您提供的文件名包含空格,请使用引号将文本引起来(例如,"File Name")。要使用引号,必须使用 usebackq。否则,就将引号解释为定义要解析的文字字符串。
要通过将 filenameset 放在括号之间来解析命令输出,请键入:
for /F "usebackq delims==" %i IN (`set`) DO @echo %i
这个范例列举当前环境中的环境变量名。
⑤ 命令行是什么
问题一:命令行是什么意思? 命令行是在DOS下运行的命令.
在这里,先解释什么是DOS?
DOS――Disk Operation System 磁盘操作系统
目前我们常用的操作系统有windows 9x/Me,NT,2000等,都是可视化的界面。在这些系统之前的人们使用的操作系统是DOS系统。DOS系统目前已经没有什么人使用了,但是dos命令却依然存在于我们使用的windows系统之中。大部分的DOS命令都已经在Windows里变成了可视化的界面,但是有一些高级的DOS命令还是要在DOS环境下来执行。所以学习命令行对于我们熟练操作Windows系统是很有必要的。
不同的操作系统要用不同的命令进入命令行界面。
在Win9x/Me的开始菜单中的运行程序中键入mand命令,可进入命令行界面。
在Win2000/NT的开始菜单中的运行程序中键入cmd命令,可进入命令行界面。
胆的作用,比如装系统必须在DOS下进行.还有如格式化...等等..
很多很多.
问题二:从命令行运行是什么意思? 点击 开始“-----> 运行”(或WINDOWS徽标键+R),然后在打开的提示框中输入dotNetFx35setup.exe /lang:ENU,确定,即可。
问题三:命令行中cd是什么意思 cd――改变当前目录
1.功能:改变当前目录
2.类型:内部命令
3.格式:cd[盘符:][路径名][子目录名]
4.使用说明:
(1)如果省略路径和子目录名则显示当前目录;
(2)如采用“cd\”格式,则退回到根目录;
(3)如采用“cd..”格式则退回到上一级目录。
例:(1)进入到user子目录;(2)从user子目录退回到子目录;(3)返回到根目录。
c:\>cd fox\user(进入fox子目录下的user子目录)
c:\fox\user>cd.. (退回上一级根目录,注意cd后面跟着两个点..)。
c:\fox>cd\ (返回到根目录)
c:\
问题四:打开任务管理器的命令行是什么 1,右键任务栏选任务管理器,2,按ctrl+alt+del,3开始运行输入taskmgr或者taskmg.exe确定,4,打开我的电脑打开C盘windows文件夹里面的system32子文件夹找到taskmgr.exe双击
问题五:DOS命令提示符是什么 命令提示符 DOS似乎只有现在的老鸟有过接触,新学电脑的人对DOS只是一知半解。它曾经占领了个人电脑操作系统领域的大部分,全球绝大多数电脑上都能看到它的身影。由于DOS系统并不需要十分强劲的硬件系统来支持,所以从商业用户到家庭用户都能使用。虽然用现在的眼光看它不是出色的操作系统,但微软软件向下兼容的特点,决定了Windows出问题的时候,很多时候需要在DOS下才能得到解决,尤其对于广大电脑爱好者及平时喜欢DIY的朋友来说,因此了解与学习DOS还是很有必要的。 启动
命令提示符常用启动方式有两种:1:开始\所有程序\附件\命令提示符
2:开始\运行\cmd
基本指令-不分大小写DOS 命令总共大约有一百个(包括文本编辑、查杀病毒、配置文件、批处理等),我们。这里详细介绍几个常用的DOS 命令。
1 dir
dir 是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。
【功能】:显示指定磁盘、目录中的文件和子目录信息,包括文件及子目录所在磁盘的卷标、文件与子目录的名称、每个文件的大小、文件及目录建立的日期时间,以及文件子目录的个数、所占用总字节数以及磁盘上的剩余总空间等信息。
【格式】:dir [C:][path][filename][.ext][/o][/s][/p][/w][/a]
【说明】:dir 是DOS 命令中最常用的一个。斜杠表示后面的内容是参数。DOS 参数最常用的参数如下: dir 命令常用参数含义
参 数 意 义
/p 显示信息满一屏时,暂停显示,按任意键后显示下一屏 /o 排序显示。o 后面可以接不同意义的字母
/w 只显示文件名目录名,每行五个文件名。即宽行显示
/s 将目录及子目录的全部目录文件都显示
/a 将目录的全部文件(包括系统文件和隐藏文件)都显示
【举例】:查看显示【C:\】文件夹里面的所有文件。在DOS 命令提示符下输入【dir c:\ /a /p】,首先输入dir 命令,空格,其次输入要查看的目录的名字c:\,再次输入该命令的参数/a(显示所有文件)、/p(暂停显示),最后回车执行命令。小提示:DOS 中取得帮助可以:直接输入【Help】查看全部帮助,也可以【命令/?】查看该命令的帮助。 2 cd
cd 是英文change directory(改变目录)的缩写,用于改变目录位置。
【功能】:改变或显示当前目录
【格式】:cd [C:][path]
【说明】:路径可以使用绝对路径和相对路径两种。如果只有cd 而没有参数,则只显示当前路径。注意:子目录中一定有两个“特殊目录”,即“.”、“..”,其中一点表示当前目录,两点表示上一层目录。从简单实用的角度来看,我们只要学会逐层进入(cd 下一层某目录名),和逐层退出(cd..)就可以解决所有问题。当然也可以用绝对路径的办法。
【举例】进入c:盘根目录下的【Windows】目录。 3 md
md 是英文make directory(创建目录)的缩写,用于创建一个空子目录。
【功能】:创建一个子目录
【格式】:md [C:]path
【举例】:用md 在c:根目录建立一个叫做kingstone 的目录......>>
问题六:* .* 在linux命令中是什么意思 所有文件 以*.*机构的文件 比如 AAA.txt 如果没有后缀名就不行了
*是通配符代表不定字符数量,也是不定字符种类,中文英文数字都可以
只有那个小数点是必须的。
问题七:指令是什么? 指令是指示计算机执行某种操作的命令,它由一串二进制数码组成。
一条指令通常由两个部分组成:操作码 +地址码 。
操作码:指明该指令要完成的操作的类型或性质,如取数、做加法或输出数据等。
地址码:指明操作对象的内容或所在的存储单元地址。
宏指令:
宏指令是汇编语言程序中的一种伪指令
它的格式为
[ 宏指令名 ] MACRO [形式参数]
……
代码段
……
ENDM
使用了“形式参数“,它们引用宏指令时被给出的一些名字或数值(实在参数)所替换。使用形式参数给宏指令带来了很大的灵活性。
宏调用格式
[ 宏指令名 ] [实际参数]
实参数项将对应替换宏指令中形式参数。如果形式参数为标号时,则在宏调用中,实参也应为标号,且要求实参是唯一的。如果宏定义中有自己的标号,则在宏调用时,汇编程序自动地把标号变成唯一的标号.
伪指令:
伪指令(伪操作)不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作.它可以完成如处理器选择,定义程序模式,定义数据,分配存储区,指示程序结束等功能.伪指令在编译的时候并不生成代码.伪指令在编译之后就就不存在了
问题八:CMD中的CD命令是什么 先进入D盘
d:
cd d:\文件夹名
问题九:dos命令是什么 dos命令大全winver---------检查Windows版本kGEh
wmimgmt.msc----打开windows管理体系结构(WMI)xAk9
wupdmgr--------windows更新程序XBS2
wscript--------windows脚本宿主设置QQ0L
write----------写字板DMz4
winmsd---------系统信息Y8Kl
wiaacmgr-------扫描仪和照相机向导RJ1C
winchat--------XP自带局域网聊天etfL
yDG
mem.exe--------显示内存使用情况qya9
Msconfig.exe---系统配置实用程序3yNN
mplayer2-------简易widnowskmediakplayerkHSN
mspaint--------画图板ynm8
mstsc----------远程桌面连接WnGv
mplayer2-------媒体播放机m5WG
magnify--------放大镜实用程序gryK
mmc------------打开控制台z470
mobsync--------同步命令KCNf
p0m
dxdiag---------检查DirectX信息beRv
drwtsn32------q系统医生q2Cx
devmgmt.msc---5设备管理器5B5K
dfrg.msc-------磁盘碎片整理程序qYsF
diskmgmt.msc---磁盘管理实用程序DBvf
dfg-------打开系统组件服务cQGy
ddeshare-------打开DDE共享设置s7Vh
dvdplay--------DVD播放器fK7C
8jB
netUstopUmessenger-----停止信使服务Uwgg
nettstarttmessenger----开始信使服务tEc9
notepad--------打开记事本VN7I
nslookup-------网络管理的工具向导iCCJ
ntbackup-------系统备份和还原CYS1
narrator-------屏幕“讲述人”lujK
ntm *** gr.msc----移动存储管理器0hUA
ntmsoprq.msc---移动存储管理员操作请求6YaL
netstatk-an----(TC)命令检查接口kWG5
qSB
syncapp--------创建一个公文包1GVM
sysedit--------系统配置编辑器DZJR
sigverif-------文件签名验证程序WdMr
sndrec32-------录音机keBq
shrpubw--------创建共享文件夹KOyi
secpol.msc-----本地安全策略23oR
syskey---------系统加密,一旦加密就不能解开,保护windowszxp系统的双重密码z8Wn
services.msc---本地服务设置9VUt
Sndvol32-------音量控制程序MkNz
sfc.exe--------系统文件检查器fTFL
sfcd/scannow---windows文件保护dbRZ
Qmh
tsshutdn-------60秒倒计时关机命令CWp1
tourstart------xp简介(安装完成后出现的漫游xp程序)zE3y
taskmgr--------任务管理器x9HY
a6l
eventvwr-------事件查看器zbej
eudcedit-------造字程序zcPr
explorer-------打开资源管理器xkVs
e......>>
问题十:DOS的每个命令分别是什么意思 PING命令参数详解1、-a 解析计算机NetBios名。[1]示例:C:\>ping -a 192.168.1.21Pinging iceblood.yofor [192.168.1.21] with 32 bytes of data: Reply from 192.168.1.21: bytes=32 timeping -n 50 202.103.96.68 Pinging 202.103.96.68 with 32 bytes of data: Reply from 202.103.96.68: bytes=32 time=50ms TTL=241 Reply from 202.103.96.68: bytes=32 time=50ms TTL=241 Reply from 202.103.96.68: bytes=32 time=50ms TTL=241 Request timed out. ……………… Reply from 202.103.96.68: bytes=32 time=50ms TTL=241 Reply from 202.103.96.68: bytes=32 time=50ms TTL=241 Ping statistics for 202.103.96.68: Packets: Sent = 50, Received = 48, Lost = 2 (4% loss),Approximate round trip times in milli-seconds: Minimum = 40ms, Maximum = 51ms, Average = 46ms 从以上我就可以知道在给202.103.96.68发送50个数据包的过程当中,返回了48个,其中有两个由于未知原因丢失,这48个数据包当中返回速度最快为40ms,最慢为51ms,平均速度为46ms。 3、-l size . 定义echo数据包大小。在默认的情况下windows的ping发送的数据包大小为32byt,我们也可以自己定义它的大小,但有一个大小的限......>>
⑥ Oracle中通过命令行实现定时操作详解
Oracle中通过命令行实现定时操作详解 Oracle中通过命令行实现定时操作详解 Oracle基础
众所周知 一般操作系统会提供定时执行任务的方法 例如 Unix平台上提供了让系统定时执行任务的命令Crontab 但是 对于某些需求 例如 一些对数据库表的操作 最为典型的是证券交易所每日收盘后的结算 它涉及大量的数据库表操作 如果仍然利用操作系统去定时执行 不仅需要大量的编程工作 而且还会出现用户不一致等运行错误 甚至导致程序无法执行
一 分析问题
事实上 对于以上需求 我们可以利用数据库本身拥有的功能Job Queue(任务队列管理器)去实现 任务队列管理器允许用户提前调度和安排某一任务 使其能在指定的时间点或时间段内自动执行一次或多次 由于任务在数据库中被执行 所以执行效率很高
任务队列管理器允许我们定制任务的执行时间 并提供了灵活的处理方式 还可以通过配置 安排任务在系统用户访问量少的时段内执行 极大地提高了工作效率 例如 对于数据库日常的备份 更新 删除和复制等耗时长 重复性强的工作 我们就可以利用任务队列管理器去自动执行以减少工作量
目前 拥有此项功能的数据库有许多 最有代表性的是SQL Server Oracle 等 但是 要让任务队列管理器工作 还需要我们加以配置才能实现 SQL Server的功能配置是在一个图形化界面(GUI)中实现的 非常简单 利用OEM客户端管理工具 Oracle的配置也可以在一个图形界面中完成 然而大多数的用户更习惯于命令行的方式去操纵数据库 本文介绍如何通过命令行实现这种配置
二 实现步骤
.确保Oracle的工作模式允许启动任务队列管理器
Oracle定时执行 Job Queue 的后台程序是SNP进程 而要启动SNP进程 首先要确保整个系统的模式是可以启动SNP进程的 这需要以DBA的身份去执行如下命令
svrmgrl> alter system enable restricted session; 或sql> alter system disenable restricted session;
利用如上命令更改系统的会话方式为disenable restricted 为SNP的启动创造条件
.确保Oracle的系统已经配置了任务队列管理器的启动参数
SNP的启动参数位于Oracle的初始化文件中 该文件放在$ORACLE_HOME/dbs路径下 如果Oracle的SID是myora 的话 则初始化文件就是initmyora ora 在文件中对SNP启动参数的描述部分如下
job_queue_process=n job_queue_interval=N
第一行定义SNP进程的启动个数为n 系统缺省值为 正常定义范围为 ~ 根据任务的多少 可以配置不同的数值
第二行定义系统每隔N秒唤醒该进程一次 系统缺省值为 秒 正常范围为 ~ 秒 事实上 该进程执行完当前任务后 就进入睡眠状态 睡眠一段时间后 由系统的总控负责将其唤醒
如果该文件中没有上面两行 请按照如上配置添加 配置完成后 需要重新启动数据库 使其生效 注意 如果任务要求执行的间隔很短的话 N的配置也要相应地小一点
.将任务加入到数据库的任务队列中
调用Oracle的dbms_job包中的存储过程 将任务加入到任务队列中
dbms_job submit( job out binary_integer whatinarchar next_date indate intervalinvarchar no_parseinboolean)
其中
●job 输出变量 是此任务在任务队列中的编号
●what 执行的任务的名称及其输入参数
●next_date 任务执行的时间
●interval 任务执行的时间间隔 下面详细讨论一下dbms_job submit中的参数interval 严格地讲 interval是指上一次执行结束到下一次开始执行的时间间隔 当interval设置为null时 该job执行结束后 就被从队列中删除 假如我们需要该job周期性地执行 则要用 sysdate+m 表示
将任务加入到任务队列之前 要确定执行任务的数据库用户 若用户是scott 则需要确保该用户拥有执行包dbms_job的权限 若没有 需要以DBA的身份将权利授予scott用户
svrmgrl> grant execute on dbms_job to scott;
.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段
例如 我们已经建立了一个存储过程 其名称为my_job 在sql/plus中以scott用户身份登录 执行如下命令
sql> variable n number; sql> begin dbms_job submit(:n my_job; sysdate sysdate+ / ); mit; end; /
系统提示执行成功
Sql> print :n;
系统打印此任务的编号 例如结果为
如上 我们创建了一个每隔 分钟执行一次的任务号为 的任务 可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况
sql> select job next_date next_sec failures broken from user_jobs;
执行结果如下
job next_date next_sec failures broken / / : : N
这表示任务号为 的任务 下一次将在 / / : : 执行 此任务的执行失败记录为 次 注意 当执行job出现错误时 Oracle将其记录在日志里 失败次数每次自动加 当执行失败次数达到 时 Oracle就将该job标志为broken 此后 Oracle不再继续执行它 直到用户调用过程dbms_job broken 重新设置为not broken 或强制调用dbms_job run来重新执行它
lishixin/Article/program/Oracle/201311/17096