??xml version="1.0" encoding="utf-8" standalone="yes"?> 当这个错误出现的时候你得到的错误解释信息类似如? 在l之前,有必要理解下面的实例参数: 注:(x)大多数的常见?ORA-4031 的生都?SHARED POOL SIZE 有关Q这文章中的诊断步骤大多都是关于共享池的。 对于其它斚w如Large_pool或是Java_poolQ内存分配算法都是相似的Q一般来说都是因为结构不够大造成? ORA-04031 可能是因?SHARED POOL 不够大,或是因ؓ(f)片问题D数据库不能找到够大的内存块?/p>
ORA-04031 错误通常是因为库高速缓冲中或共享池保留I间中的片?在加大共享池大小的时 候考虑调整应用,使用׃n的SQL q且调整如下的参敎ͼ(x)
那么ORA-04031 错误是因ؓ(f)׃n池保留空间缺连l空间所致。要解决q个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进?享池保留I间的对象数目,q增?SHARED_POOL_RESERVED_SIZE ?SHARED_POOL_SIZE 来加大共享池保留I间的可用内存?/p>
如果Q?
那么是因为在库高速缓冲缺连l空间导致ORA-04031 错误? W一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留I间中ƈ且加大SHARED_POOL_SIZE? Oracle推荐对你的系l打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关Q可以通过使用q些补丁来避免? 下面表中ȝ和和q个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁? _SQLEXEC_PROGRESSION_COST=0 在你~译Java代码的时候如果内存溢出,你会(x)看到错误Q?/p>
解决办法是关闭数据库然后把参?JAVA_POOL_SIZE 讑֮Z个较大的倹{这里错误信息中提到?"shared pool" 其实׃n全局?SGA)溢出的误|q不表示你需要增加SHARED_POOL_SIZEQ相反,你必d?JAVA_POOL_SIZE 参数的|然后重启动系l,再试一下。参? <Bug:2736601> ?br> 很多情况下,׃n池过能够导致ORA-04031错误。下面信息有助于你调整共享池大小Q? 命中率有助于你衡量共享池的用,有多语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率:(x) 如果丢失过1%,那么试通过加大׃n池的大小来减库高速缓冲丢失?/p>
要计最适合你工作负载的׃n池大,请参考:(x) 每一ơ,需要被执行的SQL 或者PL/SQL 语句的解析Ş式蝲入共享池中都需要一块特定的q箋的空间。数据库要扫描的W一个资源就是共享池中的I闲可用内存。一旦空闲内存耗尽Q数据库要查找一块已l分配但q没使用的内存准备重用。如果这L(fng)切寸的大块内存不可用Q就l箋按照如下标准LQ?/p>
q样大块的内存被分开Q剩余的d到相应的I闲I间列表中。当数据库以q种方式操作一D|间之后,׃n池结构就?x)出现碎片? 当共享池存在片的问?分配一片空闲的I间׃(x)p更多的时?数据库性能也会(x)下降(整个操作的过E中Q?chunk allocation"被一个叫?shared pool latch" 的闩所控制) 或者是出现 ORA-04031 错误errors (在数据库不能扑ֈ一个连l的I闲内存块的时?? 要减碎片的产生你需要确定是前面描叙的几U可能的因素。可以采取如下的一些方法,当然不只局限于q几U? 应用调整、数据库调整或者实例参数调整? 下面的视图有助于你标明共享池中非׃n的SQL/PLSQLQ? q个视图保存?jin)在数据库中执行的SQL 语句和PL/SQL 块的信息。下面的SQL 语句可以昄l你带有literal 的语句或者是带有l定变量的语句:(x) ? Having 后的数?"30" 可以Ҏ(gu)需要调整以得到更ؓ(f)详细的信息? q个固定表x$ksmlru 跟踪׃n池中D其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了(jin)大的应用? 如果很多对象在共享池中都被阶D|的h可能D响应旉问题q且有可能在对象重蝲入共享池中的时候导致库高速缓冲闩竞争问题? 关于q个x$ksmlru 表的一个不d的地方就是如果有Z表中选取内容q个表的内容׃(x)被擦除。这栯个固定表只存储曾l发生的最大的分配。这个值在选择后被重新讑֮q样接下来的大的分配可以被标讎ͼ即它们不如先前的分配过的大。因L(fng)重置Q在查询提交后的l果不可以再ơ得刎ͼ从表中的输出的结果应该小?j)的保存。监视这个固定表q行如下操作Q? q个表只可以用SYS用户dq行查询? 使用q个视图能找出当前分配的I闲I间Q有助于理解׃n池碎片的E度。如我们在前面的描述Q查找ؓ(f)游标分配的够的大块内存的第一个地Ҏ(gu)I闲列表( free list)?下面的语句显CZ(jin)I闲列表中的大块内存: 大池是个可选的内存区,Z下的操作提供大内存分配:(x) 从大池分配的内存如果是LARGE_POOL_MIN_ALLOC 子节的整块数有助于避免碎片。Q何请求分配小于LARGE_POOL_MIN_ALLOC 大块寸都将分配LARGE_POOL_MIN_ALLOC的大。一般来_(d)你会(x)看到使用大池的时候相对共享池来说要用到更多的内存。通常要解军_池中的ORA-4031错误必须增加 LARGE_POOL_SIZE 的大?/p>
如果前述的这些技术内定w不能解决ORA-04031 错误Q可能需要额外的跟踪信息来得到问题发生的׃n池的快照? 调整init.ora参数d如下的事件得到该问题的跟t信息:(x) 重要标注: Oracle 9.2.0.5 和Oracle 10g 版本中,每次在发生ORA-4031 错误的时候会(x)自动创徏一个跟t文Ӟ可以在user_dump_dest 目录中找到。如果你的系l是上述的版本,你不需要再q行前面描述中的步骤? 下面的片断{载于www.itpub.net
[TIP]关于Java开发中使用Oracle数据库的一Ҏ(gu)意事(原创Q?/font>
很多朋友在Java开发中Q用Oracle数据库的时候,l常?x)碰到有ORA-01000: maximum open cursors exceeded.的错误?
04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
// *Cause: More shared memory is needed than was allocated in the shared
// pool.
// *Action: If the shared pool is out of memory, either use the
// dbms_shared_pool package to pin large packages,
// reduce your use of shared memory, or increase the amount of
// available shared memory by increasing the value of the
// INIT.ORA parameters "shared_pool_reserved_size" and
// "shared_pool_size".
// If the large pool is out of memory, increase the INIT.ORA
// parameter "large_pool_size".
1.׃n池相关的实例参数
q个参数指定?jin)共享池的大,单位是字节。可以接受数字值或者数字后面跟上后~"K" ?"M" ?K"代表千字? "M"代表兆字节?
指定?jin)?f)׃n池内存保留的用于大的q箋h的共享池I间。当׃n池碎片强制 Oracle 查找q攑֤块未使用的池来满_前的h的时候,q个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降?
SELECT nam.ksppinm NAME, val.ksppstvl VALUE
FROM x$ksppi nam, x$ksppsv val
WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'
ORDER BY 1;
10g 注释QOracle 10g 的一个新Ҏ(gu)叫?"自动内存理" 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来_(d)当数据库需要分配一个大的对象到׃n池中q且不能扑ֈq箋的可用空_(d)自动用其他SGAl构的空闲空间来增加׃n池的大小 。既然空间分配是Oracle自动理的,ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被ȀzR当前设定可以通过查询v$sga_dynamic_components 视图获得。请参?0g理手册以得到更多内??2.诊断ORA-04031 错误
首先判定是否ORA-04031 错误是由׃n池保留空间中的库高速缓冲的片产生的。提交下的查询:(x)
SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.
如果:
SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
last_failure_size
FROM v$shared_pool_reserved;
REQUEST_FAILURES > 0 q且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC
REQUEST_FAILURES > 0 q且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或?
REQUEST_FAILURES {于0 q且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
3.解决ORA-04031 错误
BUG
描述
Workaround
Fixed
<Bug:1397603>
ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles
_db_handles_cached = 0
901/ 8172
<Bug:1640583>
ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access
Not available
8171/901
<Bug:1318267>
INSERT AS SELECT statements may
not be shared when they should be
if TIMED_STATISTICS. It can lead to ORA-4031
8171/8200
<Bug:1193003>
Cursors may not be shared in 8.1
when they should beNot available
8162/8170/ 901
<Bug:2104071>
ORA-4031/excessive "miscellaneous" shared pool usage possible. (many PINS)
None-> This is known to affect the XML parser.
8174, 9013, 9201
<Note:263791.1>
Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset
Not available
9205
A SQL exception occurred while compiling: :
ORA-04031: unable to allocate bytes of shared memory
("shared pool","unknown object","joxlod: init h", "JOX: ioc_allocate_pal")
SELECT SUM(PINS) "EXECUTIONS",
SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"
FROM V$LIBRARYCACHE;
参?<Note:61623.1>: 可以得到关于׃n池碎片的详细讨论?
如果SHARED_POOL_SIZE _大,大多数的 ORA-04031 错误都是由共享池中的动态SQL 片D的。可能的原因如下Q?
请参?<Note:62143.1>Q描qC(jin)所有的q些l节内容。这个注释还包括?jin)共享池如何工作的细节?
SELECT SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),
SUM (executions) "TotExecs"
FROM v$sqlarea
WHERE executions < 5
GROUP BY SUBSTR (sql_text, 1, 40)
HAVING COUNT (*) > 30
ORDER BY 2;
SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;
SELECT '0 (<140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",
COUNT (*) "Count", MAX (ksmchsiz) "Biggest",
TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"
FROM x$ksmsp
WHERE ksmchsiz < 140 AND ksmchcls = 'free'
GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)
UNION ALL
SELECT '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),
COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
TRUNC (SUM (ksmchsiz)) "Total"
FROM x$ksmsp
WHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'
GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)
UNION ALL
SELECT '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),
COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
TRUNC (SUM (ksmchsiz)) "Total"
FROM x$ksmsp
WHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'
GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)
UNION ALL
SELECT '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),
COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
TRUNC (SUM (ksmchsiz)) "Total"
FROM x$ksmsp
WHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'
GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)
UNION ALL
SELECT '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),
COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
TRUNC (SUM (ksmchsiz)) "Total"
FROM x$ksmsp
WHERE ksmchsiz >= 4108 AND ksmchcls = 'free'
GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);
4. ORA-04031 错误?Large Pool
大池没有LRU列表。这和共享池中的保留I间不同Q保留空间和׃n池中其他分配的内存用同L(fng)LRU列表。大块内存从不会(x)换出大池中,内存必须是显式的被每个会(x)话分配ƈ释放。一个请求如果没有够的内存Q就?x)生类DL(fng)一个ORA-4031错误Q?
q个错误发生时候可以检查几件事情:(x)
ORA-04031: unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool';
5. ORA-04031 和共享池h
有一些技巧会(x)提高游标的共享能力,从而共享池片和ORA-4031都会(x)减少?strong>最佳途径是调整应用用绑定变?/strong>。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到 (要注意那?x)导致执行计划改变,所以徏议先对应用进行测?。当上述技巧都不可以用的时候,q且片问题在系l中比较严重Q刷新共享持可能有助于减ȝ片问题。但是,必须加以如下考虑Q?
6. ORA-04031错误的高U分?
event = "4031 trace name errorstack level 3"
event = "4031 trace name HEAPDUMP level 3"
如果问题可重玎ͼ该事件可讑֮在会(x)话层Q在执行问题语句之前使用如下的语句:(x)
SQL> alter session set events '4031 trace name errorstack level 3';
SQL> alter session set events '4031 trace name HEAPDUMP level 3';
把这个跟t文件发lOracle支持人员q行排错?
参考信?/h2>
Metalink - http://metalink.oracle.com
<Note:1012046.6> How to Calculate Your Shared Pool Size
<Note:62143.1> Understanding and Tuning the Shared Pool
<Note:1012049.6> Tuning Library Cache Latch Contention
<Note:61623.1> Resolving Shared Pool Fragmentation
<Note:146599.1> Diagnosing and Resolving Error ORA-04031
]]>
ȝ?jin)一下如何tomcat下配|jsp、servlet和Javabean?br />
W一步:(x)下蝲j2sdk和tomcatQ到sun官方站点Q?
http://java.sun.com/j2se/1.4.2/download.htmlQ下载j(lu)2sdkQ注意下载版本ؓ(f)Windows
Offline Installation的SDKQ同时最好下载J2SE 1.4.2 documentQtionQ然后到tomcat官方站点Q?
http://www.apache.org/dist/jakarta/tomcat-4/Q下载tomcatQ下载最?.1.x版本的tomcatQ;
W二步:(x)安装和配|你的j2sdk和tomcatQ执行j2sdk和tomcat的安装程序,然后按默认设|进行安装即可?br />1.安装j2sdk以后Q需要配|一下环境变量,在我的电(sh)?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的j2sdk安装在c:\j2sdk1.4.2)Q?br />JAVA_HOME=c:\j2sdk1.4.2
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Q?;一定不能少Q因为它代表当前路径Q?br />path=%JAVA_HOME%\bin
接着可以写一个简单的javaE序来测试J2SDK是否已安装成功:(x)
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}
上面的q段E序保存为文件名为Test.java的文件?br />然后打开命o(h)提示W窗口,cdC的Test.java所在目录,然后键入下面的命?
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功?jin),如果没有打印(gu)句话Q你需要仔l检查一下你的配|情c(din)?br />
2.安装Tomcat后,在我的电(sh)?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的tomcat安装在c:\tomcat)Q?br />CATALINA_HOME=c:\tomcat;
CATALINA_BASE=c:\tomcat;
然后修改环境变量中的classpathQ把tomat安装目录下的common\lib下的servlet.jarq加到classpath中去Q修改后的classpath如下Q?br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;
接着可以启动tomcatQ在IE中访?
http://localhost:8080Q如果看到tomcat的欢q页面的话说明安装成功了(jin)?/font>
W三步:(x)建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录Q可以看到ROOTQexamples, tomcat-docs之类Tomcat自带的的目录Q?br />2.在webapps目录下新Z个目录,起名叫myappQ?br />3.myapp下新Z个目录WEB-INFQ注意,目录名称是区分大写的;
4.WEB-INF下新Z个文件web.xmlQ内容如下:(x)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd
";>
<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>
5.在myapp下新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:(x)
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>
6.重启Tomcat
7.打开览器,输入
http://localhost:8080/myapp/index.jsp
看到当前旉的话说明成功了(jin)?br />
W四步:(x)建立自己的ServletQ?br />1.用你最熟?zhn)的编辑器Q徏议用有语法(g)查的java ideQ新Z个servletE序Q文件名为Test.javaQ文件内容如下:(x)
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html><body><h1>This is a servlet test.</h1></body></html>");
out.flush();
}
}
2 .~译
Test.java攑֜c:\test下,使用如下命o(h)~译Q?br />C:\Test>javac Test.java
然后在c:\Test下会(x)产生一个编译后的servlet文gQTest.class
3 .结构test\Test.class剪切?CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,新Z个?现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结?br />4 .修改webapps\myapp\WEB-INF\web.xmlQ添加servlet和servlet-mapping
~辑后的web.xml如下所C,U色为添加的内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd
";>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description>A test Servlet</description>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
</web-app>
q段话中的servletq一D声明了(jin)你要调用的ServletQ而servlet-mapping则是声明的servlet“映”到地址/Test?br />5 .好了(jin)Q启动TomcatQ启动浏览器Q输?
http://localhost:8080/myapp/Test
如果看到输出This is a servlet test.p明编写的servlet成功?jin)?br />注意Q修改了(jin)web.xml以及(qing)新加?jin)classQ都要重启Tomcat
W四步:(x)建立自己的BeanQ?br />1.用你最熟?zhn)的编辑器Q徏议用有语法(g)查的java ideQ新Z个javaE序Q文件名为TestBean.javaQ文件内容如下:(x)
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}
2 .~译
TestBean.java攑֜c:\test下,使用如下命o(h)~译Q?br />C:\Test>javac TestBean.java
然后在c:\Test下会(x)产生一个编译后的bean文gQTestBean.class
3 .TestBean.class文g剪切?%CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新徏一个TestBean.jsp文gQ文件内容ؓ(f)Q?br /><%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>
5 .好了(jin)Q重启TomcatQ启动浏览器Q输?
http://localhost:8080/myapp/TestBean.jsp
如果看到输出Java bean name is: This is a test java bean.p明编写的Bean成功?jin)?br />
q样完成了(jin)整个Tomcat下的jsp、servlet和javabean的配|。接下来需要做的事情就是多看书、多d人的好代码,自己多动手写代码以增己在q方面开发的能力?jin)?/font>
]]>
实际上,q个错误的原因,主要q是代码问题引v的?
ora-01000: maximum open cursors exceeded.
表示已经辑ֈ一个进E打开的最大游标数?
q样的错误很Ҏ(gu)出现在Java代码中的主要原因是:(x)Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开?jin)一个cursor。尤其是Q如果你的createStatement和prepareStatement是在一个@环里面的话,׃(x)非常Ҏ(gu)出现q个问题。因为游标一直在不停的打开Q而且没有关闭?
一般来_(d)我们在写Java代码的时候,createStatement和prepareStatement都应该要攑֜循环外面Q而且使用?jin)这些Statment后,?qing)时关闭。最好是在执行了(jin)一ơexecuteQuery、executeUpdate{之后,如果不需要用结果集QResultSetQ的数据Q就马上Statment关闭?
对于出现ORA-01000错误q种情况Q单U的加大open_cursorsq不是好办法Q那只是L不治本。实际上Q代码中的隐(zhn)ƈ没有解除?
而且Q绝大部分情况下Qopen_cursors只需要设|一个比较小的|p够用了(jin)Q除非有非常特别的要求?/font>
]]>
vi filename 指示shell启动vi~辑器,q将参数filename传给它。如果当前目前中存在该文Ӟ则vi~辑器将它解释ؓ(f)要打开的文Ӟ如果没有该文Ӟ则vi~译器创建新文g
vi file1 file2 file3 shell传?个参数给viQvi它们解释ؓ(f)要打开的文件。可以?w命o(h)保存文gQ?n命o(h)讉K下一个文?
vi +# filename 打开文gQƈ光标移到指定的行。例如,命o(h)vi +100 records 从第100行开始编辑文件records
vi +/the filename 打开文gQƈ光标移动包含有目标字符串的行。例如,命o(h)vi +/Jason friends 从第1个含有字W串Jason的行开始编辑文件friends
view filename 打开文gq行~辑Q但是拒l保存对文g的修改,除非使用w!命o(h)
光标Ud命o(h)
hjkl 光标分别向左、下、上、右Ud一个字W?
0(? 光标移到当前行的行?
^(脱字W? ?一样将光标Ud当前行的行首
$ 光标移到当前行的行?
##G 光标移到G前面的数字指定的行。例如,42G光标移到文件的W?2?
G 光标移到文件的最后一?
w 光标向前移C一个单词的首字?
e 光标向前移C一个单词的最后一个字?
b 光标向后移C一个单词首字母
- 光标定位到上一行的行首
+ 光标定位到下一行的行首
12| 光标定位到当前行的W?2?
L 光标定位到屏幕的最下面一?
M 光标定位到屏幕中间的一?
H 光标定位到屏幕的最上面一?
'' 两个单引号将光标Ud它的先前的位|?
光标定位命o(h)Q上下文的)(j)
fb 光标向前移到当前行上的下一个字母bQ或者其他的L指定的字W)(j)
Fb 光标向后移到当前行上的上一个字母bQ或指定的字W)(j)
t# 光标移到当前行上字W#的第1个实例的右侧。例如,命o(h)tM光标移到当前行上第1个M的右?
T# 在当前行上向左移动光标,它Ud字符Q的W?个实例的前一字符
/word 光标向前移到单词word的下一个实?
?word 光标向后移到单词word的上一个实?
n 光标移到前面命?word?word中指定模式的下一个实?
昄调整命o(h)
Ctrl+D 昄文g中的下半屏文?
Ctrl+U 昄文g中的上半屏文?
Ctrl+F 昄文g中的下一屏文?
Ctrl+B 昄文g中的上一屏文?
讄昄选项
:set number 行号作为屏q显C的一部分Q但是行号ƈ不是文g的一部分。它的羃写Ş式ؓ(f):set nu
:set nonumber 清除屏幕上的行号。也可以使用~写形式:set nonu
:set showmode 在屏q的右下角显C加模式信?
:set list 在每行的行末昄元W号Qƈ用Ctrl+I表示制表W?
:set showmatch 在输入)(j)或]Ӟ光标移C之匹配的Q或[
:set window=value 定义屏幕上显C的文本行的行数
:set autoindent 自动~进。也可以使用~写形式:set ai
:set tabstop=value 讄昄制表W的I格字符个数。也可以使用~写形式ts=value
:set wrapmargin=value 讄昄器的右页辏V当输入q入所讄的页Ҏ(gu)Q编辑器自动回R换行
:set ignorecase 指示~辑器搜索字W串Qƈ忽略目标中字母的大小?
:set 昄讄的所有选项
:set all 昄所有可以设|的选项
文本删除命o(h)
dd 删除当前光标所有的文本?
#dd 删除Q行文本
dw 从文本中删除一个单?
#dw 从文本中删除Q个单词
x 删除光标所在的一个字W?
#x 从文本中删除Q个字符
D 删除当前行上光标后面的部?
:#,#d 例如Q?12,37d 删除第12?7行之间的所有文本,包括W?2?7?
撤销命o(h)
u 撤销。恢复最q一ơ的文本修改操作Q即使已l移动了(jin)光标。在Linuxpȝ中,再次使用撤销命o(h)恢复更前一ơ的文本修改操作。在BSD的vi中,W?ơ撤销操作撤销W一ơ撤销操作Q恢复第1ơ撤销前修改的文本
:redo 在Linuxpȝ中,取消撤销操作恢复文本修改。在标准的UNIXpȝ中,W?个u命o(h)取消W?个u命o(h)Q结果就是一个“redo?
U 如果在修改后q没有将光标Ud当前行,则可以撤销对当前行q行的所有的文本修改
向文本中d文本
a(写) 从光标的右侧开始插入文?
A(大写) 从当前行的行末开始添加文?
i(写) 从光标的左侧开始插入文?
I(大写) 从当前行的行首插入文?
o(写) 在光标的下面打开Q或插入Q一个新?
O(大写) 在光标的上面打开一个新?
:#r filename 例如Q?8r report.oldd文greport.oldQƈ它的内Ҏ(gu)到当前文件的W?行之?
Esc 无论使用什么命令进入了(jin)q加/插入模式Q都可以通过按Esc键离开q加模式q回到vi的命令模?
Ctrl+V 允许输入控制字符。按Ctrl+V键后再按回R键将把Ctrl+M插入到文件中
在文件中修改文本
cw 仅仅修改光标处的单词Q删除单词,然后q入q加模式中,以在被删除单词的位置d文本Q?
s(写) 替换单个字符
S(大写) 替换整行文本
cc 替换整行文本(同S)
r 用输入的下一个字W替代当前光标处的字W,q自动返回到命o(h)模式
R 编辑器攑ֈ覆盖模式Q用输入的字W来逐个替换光标处的字符
C(大写) 修改行上从光标到行末之间的文?
ct# 修改行上从光标到前向W?个目标字W之间的文本。例如ctY删除当前行上从光标到向前第1个字WY之间的所有文本,q进入追加模式以在删除文本的位置d文本
cf# 修改行上从光标到前向W?个目标字W之间的文本Q包括目标字W)(j)。例如cfY删除当前行上从光标到向前第1个字WY之间Q包括YQ的所有文本,q进入追加模式以在删除文本的位置d文本
cT# 修改行上从光标到后向W?个目标字W之间的文本。例如cTY删除当前行上从光标到向后第1个字WY之间的所有文本,q进入追加模式以在删除文本的位置d文本
cF# 修改行上从光标到后向W?个目标字W之间的文本Q包括目标字W)(j)。例如cFY删除当前行上从光标到向后第1个字WY之间Q包括YQ的所有文本,q进入追加模式以在删除文本的位置d文本
接出和粘贴行的单?
yy 当前行复制或接出到内在~冲区?0yy当前行和它后面?9行(?0行)(j)文本复制到内存。目标行仍然保留在文件中Q可以用p命o(h)这些内存中的文本粘贴到文g?
dd 删除当前行,q将它放Cyy命o(h)使用的相同的内存~冲区。目标行从文件中删除Q但是可以用p命o(h)它_脓(chung)到文件中的其他地?
yw 当前光标所在的单词接出或复制到内在~冲区?yw命o(h)把当前单词和它后面?个(?个)(j)单词复制到内?
dw 删除当前的单词,q将它放Cyw命o(h)使用的相同的内存~冲区。可以用p命o(h)单词粘贴到文g的其他地?
yt# 接出从光标到向前一个字W(不包括该字符Q之间的文本。例如,ytB命o(h)从光标到字WB的下一实例Q不包括字符BQ之间的文本接出或复制到内存
yf# 接出从光标到向前一个字W(包括该字W)(j)之间的文本。例如,yf:命o(h)从光标到字W?的下一个实例(包括字符:Q之间的文本接出或复制到内存
yT# 后向接出Q不包括目标字符Q。例如,yTN命o(h)从光标到字WN的后向第1个实例之间的文本Q不包括字符NQ接出或复制到内?
yF# 后向接出Q包括目标字W)(j)。例如,yFJ命o(h)把从光标到字符N的向后第1个实例之间的文本Q包括字WNQ接出或复制到内?
p 内存中的文本行_脓(chung)到文件中光标所在行的下面,或将内存中的单词_脓(chung)到文件中光标的右?
P(大写) 接出或删除的文本行_脓(chung)到文件中光标所在行的上面。或接出或删除的单词粘贴到文g中光标的左侧
文gUd命o(h)
J 下行文本同当前行合q成一?
:#,# move # 指定的行移到目标位|?12,35 move 58命o(h)第12?5行之间的所有文本移到第58行的后面。羃写ؓ(f)mo
:1,26 co 82 第1?6行之间的所有文本复制到W?2行的后面Q可以选择行号Q?
使用可视化编辑器q行全局~辑
:s /target/replacement/ 查找当前行上目标字符串的W?个实例ƈ删除Q然后用字符串replacement替换。只修改当前行上的第1个目标实?
:g /target/s//replacement/ 查找所有行上目标字W串的第1个实例ƈ删除Q然后用字符串replacement替换。修Ҏ(gu)有行上目标的W?个实?
:#,# s/target/replacement/ 在指定的行上q行替换。例如,:7,37 s/march/walk/查扄7?7行之间的所有文本行Qƈ用字W串walk替换每行中的W?个目标字W串march。所有指定行上的W?个目标字W串修改
:#,# s/target/replacement/g 在指定的行上q行全局替换。例如,:1,$ s/fun/joyful/g 在W?行到文g最后一行之间查扄标字W串fun的所有实例ƈ删除Q然后用字符串joyful替换。指定行上的目标字符串的所有实例都被修?
:g /target/s/replacement 查找所有行上目标字W串的第1个实例ƈ删除Q然后用字符串replacement替换。所有行上的W?个目标都被修?
:#,# target/s/replacement/ 在指定的行上q行替换Q例如,:7,37 march/s/walk命o(h)在第7?7行之间每个文本行上查扄标字W串的第1个实例ƈ删除Q然后用字符串walk替换。所有指定行上的W?个目标字W串都被修改
:#,# target/s/replacement/g 在指定的行上q行全局替换。例如,:1,$ fun/s/joyful/g在W?行到文g最后一行之间查扄标字W串fun的所有实例ƈ删除Q然后用字符串joyful替换。指定行上的所有目标字W串都被修改
~辑工具Q映,~写和标?
m# 用字母标记当前行。例如,ma命o(h)表示用a标记当前行。即使移动了(jin)标记行,它仍然标Cؓ(f)aQ可以用a来定位该?
'# 定位标记行。例如,命o(h)'a光标移到标记a的行。命?a,$d删除从标记行到文g末尾之间的所有行
:map # command string 在命令模式中输入Q时Q将其作Z个命令串。例如,:map #o#!/bin/ksh产生一个新的命令模式指令,(zhn)输入#Ӟ它被解释?o打开个新行,q添加文?!/bin/ksh到文件中。ؓ(f)?jin)在命o(h)中包含回车和其他控制字符Q可以在它们的前面用Ctrl+V命o(h)
:ab abbreviation char-string 讄q加模式~写。例如,在命令模式中输入:ab mv Milky Way GalaxyQ则建立~写。如果在q加模式中输入字W串mwQ然后按Esc键,mw被Milky Way Galaxy替代
在vi~辑器中向shell发出命o(h)
:!ls 启动一个shellQƈ让shellq行lsE序。在q行完指定的E序后,必须按回车键以返回到~辑器中
:!ksh 启动一个shellQ它允许q行多个命o(h)。退出shell可以回到~译器中
:Or!speel% 对当前文?%)q行拼写(g)查,q将spell的输?gu)到当前文g中,从第1?0行后?开始放|这些输?
:31r!command% q行UNIX命o(h)Q如cal或dateQƈ它的输?gu)入到当前文gQ从W?1行开始放|这些输?
Ctrl+Z 用于挂v当前~辑?x)话q程的csh和ksh命o(h)Q它允许(zhn)向父shell发出命o(h)
fg 重新ȀzLL(fng)~辑q程的csh和ksh命o(h)
诅R写和退出编辑器
:wq 保存~辑?x)话期间?gu)件所做的修改Q退出编辑器q回到shell
:q 如果没有Ҏ(gu)件进行修Ҏ(gu)d文gQ可以用q退出对一个文件的~辑
:q! 退出对文g的编辑返回到shell模式Q但是不保存在编辑会(x)话期间对文g所做的修改
:w filename v文件的~冲区副本(修改版本Q保存到一个新文g
[color=#DC143C][b]:#,# w newtest 例如Q?1,6 w newtext命o(h)创徏一个名为newtext的文Ӟq将当前文g的第1?行文本复制到文gnewtext?
:1,6 w >> oldfile 当前文件的W??行文本的一个副本追加到已有文goldfile的末?
:1,6 w! oldfile 用当前文件的W??行文本覆盖文件oldfile
]]>
function strDateTime(str){
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
var r = str.match(reg);
if(r==null)return false;
var d= new Date(r[1], r[3]-1,r[4]);
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate()
return newStr==str
}
alert(strDateTime("2002-1-31"))
alert(strDateTime("2002-1-41"))
</script>
<script language=javascript>
function strDateTime(str){
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
var r = str.match(reg);
if(r==null)return false;
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()
return newStr==str
}
alert(strDateTime("2002-1-31 12:34:56"))
alert(strDateTime("2001-2-29 12:54:56"))
alert(strDateTime("2002-1-41 12:00:00"))
</script>
<script language="javascript">
var s="2002-4-16"
alert(chkDate(s));
function chkDate(sDate){
var r=/\d{4}(?:-\d{1,2}){0,2}/
//正则表达式,判断是否为yyyy-mm-dd,yyyy-mm,yyyy格式
if(sDate.match(r)==sDate){
var arr=sDate.split("-")
switch(arr.length){
//Ҏ(gu)不同的yyyy-mm-dd,yyyy-mm格式判断q月日数字是否正?
case 3:
var tmpDate=new Date(arr[0],arr[1],arr[2]);
if(tmpDate.getMonth()==arr[1] && tmpDate.getFullYear()==arr[0]) return true;
break;
case 2:
if(arr[1]<13) return true;
break;
default:
return false;
}
}
return false;
}
</script>
/*
旉有效性判断函?
All by happywinds
*/
function verifyDate(textObj) {
var str=textObj.value;
textObj.value = textObj.value.replace(/\s+/g,"");
if(str.search(/^\d{4}-\d{1,2}-\d{1,2}$/) == 0){
var y = parseInt(str.split("-")[0]);
var m = parseInt(str.split("-")[1]);
var d = parseInt(str.split("-")[2]);
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(d>31){
return false;
textObj.focus();
textObj.select();
}else{
return true;
}
break;
case 2:
if((y%4==0 && d>29) || ((y%4!=0 && d>28))){
return false;
textObj.focus();
textObj.select();
}else{
return true;
}
break;
case 4:
case 6:
case 9:
case 11:
if(d>30){
return false;
textObj.focus();
textObj.select();
}else{
return true;
}
break;
default:
return false;
textObj.focus();
textObj.select();
}
}else{
return false;
textObj.focus();
textObj.select();
}
}
/**
* 新徏目录
* @param folderPath String ?c:/fqf
* @return boolean
*/
public void newFolder(String folderPath) {
try {
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
if (!myFilePath.exists()) {
myFilePath.mkdir();
}
}
catch (Exception e) {
System.out.println("新徏目录操作出错");
e.printStackTrace();
}
}
/**
* 新徏文g
* @param filePathAndName String 文g路径?qing)名U?如c:/fqf.txt
* @param fileContent String 文g内容
* @return boolean
*/
public void newFile(String filePathAndName, String fileContent) {
try {
String filePath = filePathAndName;
filePath = filePath.toString();
File myFilePath = new File(filePath);
if (!myFilePath.exists()) {
myFilePath.createNewFile();
}
FileWriter resultFile = new FileWriter(myFilePath);
PrintWriter myFile = new PrintWriter(resultFile);
String strContent = fileContent;
myFile.println(strContent);
resultFile.close();
}
catch (Exception e) {
System.out.println("新徏目录操作出错");
e.printStackTrace();
}
}
/**
* 删除文g
* @param filePathAndName String 文g路径?qing)名U?如c:/fqf.txt
* @param fileContent String
* @return boolean
*/
public void delFile(String filePathAndName) {
try {
String filePath = filePathAndName;
filePath = filePath.toString();
java.io.File myDelFile = new java.io.File(filePath);
myDelFile.delete();
}
catch (Exception e) {
System.out.println("删除文g操作出错");
e.printStackTrace();
}
}
/**
* 删除文g?BR> * @param filePathAndName String 文g夹\径及(qing)名称 如c:/fqf
* @param fileContent String
* @return boolean
*/
public void delFolder(String folderPath) {
try {
delAllFile(folderPath); //删除完里面所有内?BR> String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); //删除I文件夹
}
catch (Exception e) {
System.out.println("删除文gҎ(gu)作出?);
e.printStackTrace();
}
}
/**
* 删除文g多w面的所有文?BR> * @param path String 文g夹\??c:/fqf
*/
public void delAllFile(String path) {
File file = new File(path);
if (!file.exists()) {
return;
}
if (!file.isDirectory()) {
return;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
}
else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文?BR> delFolder(path+"/"+ tempList[i]);//再删除空文g?BR> }
}
}
/**
* 复制单个文g
* @param oldPath String 原文件\?如:(x)c:/fqf.txt
* @param newPath String 复制后\?如:(x)f:/fqf.txt
* @return boolean
*/
public void copyFile(String oldPath, String newPath) {
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文g存在?BR> InputStream inStream = new FileInputStream(oldPath); //d原文?BR> FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节?文g大小
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
inStream.close();
}
}
catch (Exception e) {
System.out.println("复制单个文g操作出错");
e.printStackTrace();
}
}
/**
* 复制整个文g夹内?BR> * @param oldPath String 原文件\?如:(x)c:/fqf
* @param newPath String 复制后\?如:(x)f:/fqf/ff
* @return boolean
*/
public void copyFolder(String oldPath, String newPath) {
try {
(new File(newPath)).mkdirs(); //如果文g夹不存在 则徏立新文g?BR> File a=new File(oldPath);
String[] file=a.list();
File temp=null;
for (int i = 0; i < file.length; i++) {
if(oldPath.endsWith(File.separator)){
temp=new File(oldPath+file[i]);
}
else{
temp=new File(oldPath+File.separator+file[i]);
}
if(temp.isFile()){
FileInputStream input = new FileInputStream(temp);
FileOutputStream output = new FileOutputStream(newPath + "/" +
(temp.getName()).toString());
byte[] b = new byte[1024 * 5];
int len;
while ( (len = input.read(b)) != -1) {
output.write(b, 0, len);
}
output.flush();
output.close();
input.close();
}
if(temp.isDirectory()){//如果是子文g?BR> copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);
}
}
}
catch (Exception e) {
System.out.println("复制整个文g夹内Ҏ(gu)作出?);
e.printStackTrace();
}
}
/**
* Ud文g到指定目?BR> * @param oldPath String 如:(x)c:/fqf.txt
* @param newPath String 如:(x)d:/fqf.txt
*/
public void moveFile(String oldPath, String newPath) {
copyFile(oldPath, newPath);
delFile(oldPath);
}
/**
* Ud文g到指定目?BR> * @param oldPath String 如:(x)c:/fqf.txt
* @param newPath String 如:(x)d:/fqf.txt
*/
public void moveFolder(String oldPath, String newPath) {
copyFolder(oldPath, newPath);
delFolder(oldPath);
}
}
初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000 ;job_queue_interval = 10 //调度作业h频率Uؓ(f)单位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user
1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from dba_jobs where job in (1,3);
查询job的情c(din)?BR>show paramter background_dump_dest.
看alter.log 和trace
SVRMGR> select * from dba_jobs;
初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000
job_queue_interval = 10 //调度作业h频率Uؓ(f)单位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user
1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from dba_jobs where job in (1,3);
查询job的情c(din)?BR>show paramter background_dump_dest.
看alter.log 和trace
请问我如何停止一个JOB
SQL> exec dbms_job.broken(1,true)
PL/SQL q程已成功完成?BR>SQL>commit //必须提交否则无效
启动作业
SQL> exec dbms_job.broken(1,false)
PL/SQL q程已成功完成?/P>
停其他用L(fng)job
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;
============================
exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //标记位broken
exec dbms_job.broken(186,false)//标记为非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行旉
exec dbms_job.remove(:job)Q删?BR>exec dbms_job.remove(186);
commitQ?/P>
把一个broken job重新q行
三、查看相关job信息
1、相兌?BR>dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在q行job相关信息
创徏JOB
variable jobno number;
begin
dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
commit;
end;
print jobno
例如Q我们已l徏立了(jin)一个存储过E,其名UCؓ(f)my_jobQ在sql/plus中以scott用户w䆾dQ执行如下命令:(x)
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;?sysdate,
‘sysdateQ?/360?;
commit;
end;
Sql> print :n;
pȝ提示执行成功?
Sql> print :n;
pȝ打印此Q务的~号Q例如结果ؓ(f)300?
单例?BR>一个简单例子:(x)
创徏试?BR>SQL> create table TEST(a date);
表已创徏?/P>
创徏一个自定义q程
SQL> create or replace procedure MYPROC as
2 begin
3 insert into TEST values(sysdate);
4 end;
5 /
q程已创建?/P>
创徏JOB
SQL> variable job1 number;
SQL>
SQL> begin
2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440'); --每天1440分钟Q即一分钟q行testq程一?BR> 3 end;
4 /
PL/SQL q程已成功完成?/P>
q行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /
PL/SQL q程已成功完成?/P>
SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 旉 from TEST;
旉
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24
删除JOB
SQL> begin
2 dbms_job.remove(:job1);
3 end;
4 /
PL/SQL q程已成功完成?/P>
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/P>
a、利用dbms_job.run()立即执行该job
sql>begin
sql>dbms_job.run(:jobno) 该jobno为submitq程提交时返回的job number
sql>end;
sql>/
b、利用dbms_job.broken()重新broken标记为false
sql>begin
sql>dbms_job.broken (:job,false,next_date)
sql>end;
sql>/
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
SQL> create table a(a date);
Table created
创徏一个过E?BR>SQL> create or replace procedure test as
2 begin
3 insert into a values(sysdate);
4 end;
5 /
Procedure created
提交作业
SQL> declare
2 job1 number; //定义一个数字型变量
3 begin
4 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'); //按分钟算一?440分钟
5 end;
6 /
PL/SQL procedure successfully completed
job1
---------
4
SQL> commit;
Commit complete
q行作业
SQL> begin
2 dbms_job.run(4);
3 end;
4 /
PL/SQL procedure successfully completed
删除作业
SQL> begin
2 dbms_job.remove(4);
3 end;
4 /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete
job change//修改作业
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');
DBA_JOBS
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?BR>字段Q列Q?nbsp; cd 描述
JOB NUMBER d的唯一标示?
LOG_USER VARCHAR2(30) 提交d的用?
PRIV_USER VARCHAR2(30) 赋予d权限的用?
SCHEMA_USER VARCHAR2(30) 对Q务作语法分析的用h?
LAST_DATE DATE 最后一ơ成功运行Q务的旉
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小Ӟ分钟和秒
THIS_DATE DATE 正在q行d的开始时_(d)如果没有q行d则ؓ(f)null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小Ӟ分钟和秒
NEXT_DATE DATE 下一ơ定时运行Q务的旉
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小Ӟ分钟和秒
TOTAL_TIME NUMBER 该Q务运行所需要的L_(d)单位为秒
BROKEN VARCHAR2(1) 标志参数QY标示d中断Q以后不?x)运?
INTERVAL VARCHAR2(200) 用于计算下一q行旉的表辑ּ
FAILURES NUMBER dq行q箋没有成功的次?
WHAT VARCHAR2(2000) 执行d的PL/SQL?
CURRENT_SESSION_LABEL RAW MLSLABEL 该Q务的信QOracle?x)话W?
CLEARANCE_HI RAW MLSLABEL 该Q务可信Q的Oracle最大间?
CLEARANCE_LO RAW MLSLABEL 该Q务可信Q的Oracle最间?
NLS_ENV VARCHAR2(2000) dq行的NLS?x)话讄?
MISC_ENV RAW(32) dq行的其他一些会(x)话参?
描述 INTERVAL参数?
每天午夜12?nbsp; 'TRUNC(SYSDATE + 1)'
每天早上8?0?nbsp; 'TRUNC(SYSDATE + 1) + Q?*60+30Q?(24*60)'
每星期二中午12?nbsp; 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12?nbsp; 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11?'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6?0?nbsp; 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + Q?×60+10Q?Q?4×60Q?
一 触发器介l?/P>
触发器是一U特D的存储q程Q它在插入,删除或修改特定表?/P>
的数据时触发执行Q它比数据库本n标准的功能有更精l和更复杂的
数据控制能力。数据库触发器有以下的作用:(x)
* 安全性。可以基于数据库的g用户h操作数据库的某种?/P>
利?/P>
# 可以Z旉限制用户的操作,例如不允怸班后和节假日
修改数据库数据?/P>
# 可以Z数据库中的数据限制用L(fng)操作Q例如不允许股票
的h(hun)格的升幅一ơ超q?0%?/P>
* 审计。可以跟t用户对数据库的操作?/P>
# 审计用户操作数据库的语句?/P>
# 把用户对数据库的更新写入审计表?/P>
* 实现复杂的数据完整性规则?/P>
# 实现非标准的数据完整性检查和U束。触发器可生比规则
更ؓ(f)复杂的限制。与规则不同Q触发器可以引用列或数据库对
象。例如,触发器可回退M企图吃进过自己保证金的期货?/P>
# 提供可变的缺省倹{?/P>
* 实现复杂的非标准的数据库相关完整性规则。触发器可以Ҏ(gu)
据库中相关的表进行连环更新。例如,在auths表author_code列上?/P>
删除触发器可D相应删除在其它表中的与之匚w的行?/P>
# 在修Ҏ(gu)删除时联修Ҏ(gu)删除其它表中的与之匹配的行?/P>
# 在修Ҏ(gu)删除时把其它表中的与之匹配的行设成NULL倹{?/P>
# 在修Ҏ(gu)删除时把其它表中的与之匹配的行联设成缺省倹{?/P>
# 触发器能够拒l或回退那些破坏相关完整性的变化Q取消试
图进行数据更新的事务。当插入一个与其主健不匚w的外部键
Ӟq种触发器会(x)起作用。例如,可以在books.author_code
列上生成一个插入触发器Q如果新gauths.author_code?/P>
中的某g匚wӞ插入被回退?/P>
* 同步实时地复制表中的数据?/P>
* 自动计算数据|如果数据的DC(jin)一定的要求Q则q行?/P>
定的处理。例如,如果公司的帐号上的资金低?万元则立即给财务?/P>
员发送警告数据?/P>
ORACLE与SYBASE数据库的触发器有一定的区别Q下面将分别讲述
q两U数据库触发器的作用和写法?/P>
?ORACLE 触发?/P>
ORACLE产生数据库触发器的语法ؓ(f)Q?/P>
create [or replace] trigger 触发器名 触发旉 触发事g
on 表名
[for each row]
pl/sql 语句
其中Q?/P>
触发器名Q触发器对象的名U。由于触发器是数据库自动执行
的,因此该名U只是一个名Uͼ没有实质的用途?/P>
触发旉Q指明触发器何时执行Q该值可取:(x)
before---表示在数据库动作之前触发器执行;
after---表示在数据库动作之后出发器执行?/P>
触发事gQ指明哪些数据库动作?x)触发此触发器?x)
insertQ数据库插入?x)触发此触发器?/P>
updateQ数据库修改?x)触发此触发器?/P>
deleteQ数据库删除?x)触发此触发器?/P>
?nbsp; 名:(x)数据库触发器所在的表?/P>
for each rowQ对表的每一行触发器执行一ơ。如果没有这一
选项Q则只对整个表执行一ơ?/P>
举例Q下面的触发器在更新表auths之前触发Q目的是不允许在
周末修改表:(x)
create trigger auth_secure
before insert or update or delete //Ҏ(gu)表更新前触发
on auths
begin
if(to_char(sysdate,'DY')='SUN'
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
end if;
end
?SYBASE数据库触发器
SYBASE数据库触发器的作用与ORACLE非常cMQ仅有较?yu)的差异?/P>
SYBASE产生触发器的语法为:(x)
CREATE TRIGGER 触发器名
ON 表名
FOR INSERTQUPDATEQDELETE
AS
SQL_statement |
FOR INSERTQUPDATE
AS
IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...
SQL_statements
上面FOR子句用来指定在触发器上的哪些数据更新命o(h)可激z该
触发器。IF UPDATE子句(g)查对指定列的操作cdQ在IF UPDATE子句
中可指定多个列?/P>
与ORACLE不同Q对于每条SQL语句Q触发器只执行一ơ。触发器
在数据更新语句完成以后立x行。触发器和启动它的语句被当作一
个事务处理,事务可以在触发器中回退?/P>
下面举例说明SYBASE触发器的写法?/P>
create trigger forinsert_books
on books
for insert
as
if(select count(*) from auths,inserted
where auths.author_code=insert.author_code)!=@@rowcount
begin
rollback transaction
print "books 表中 author_code 列的值在auths 表中不存在?
end