Windows XP里有我们常用到的工具如磁盘清理程序等等,那么它们到底叫什么名字,又躲在硬盘

的哪个地方呢?笔者这就把它们挖掘出来,以后大家再用这些工具的时候就不用一步一步地去找地方了,直

接点击“开始→运行”,再输入程序名就OK了。

1.磁盘清理大师——cleanmgr

用来自动地释放出一部分硬盘空间,并会智能化地进行删除操作。

2.剪贴板查看器——clipbrd

Windows XP中的剪贴板查看器程序较原先Windows 9X/Me的旧版本多出了共享功能,

通过设置权限允许其他网上用户将该剪贴板装入使用。

3.控制面板启动器——control

快速启动控制面板。

4.Windows XP的诊断医生——drwtsn32

Drwtsn32是一个程序错误调试器。运行后会获得并记录系统中程序错误的信息,并创建一个文本文

件drwtsn32.log ,提供错误原因的详细说明,并给出解决问题的建议性操作。

5.DVD播放器——dvdplay

Windows XP提供的一个“免费”的DVD播放器,也就是Windows Media Play

er。

6.自解压文件制作工具——lexpress

利用Iexpress可制作两种自解压文件,一种是标准自解压文件,另一种是安装程序式自解压文件。

7.备份工具——ntbackup

Windows XP中内置的备份工具。

8.IP地址侦测器——nslookup

通过这个IP侦测工具ping就可以轻而易举地得到它们的真正IP地址。

9.注册表编辑器增强版——regedt32

用来修改注册表设置的高级工具。

10.Windows升级程序——wupdmgr

联上网后,可以通过此程序进行Windows的自动升级。

11.共享文件夹设置工具——shrpubw

它的作用与右击一文件夹,选择“共享”基本上等价。

12.Microsoft签字验证工具——sigverif

所谓“签署的文件”,就是被授予Microsoft数字签署的文件。该签署表明,该文件是原始文件的

一模一样的副本。通过microsoft签字验证工具,我们可在计算机上查找已签署和未签署的文件,

也可查看签署文件的身份验证,以确认该文件还没有被篡改。

13.音量控制程序——sndvol32

平时双击任务栏上的小喇叭就会出现的音量控制程序。

14.任务管理器——taskmgr

使用任务管理器可快速查看正在运行的程序的状态,或终止已停止响应的程序,也可以查看CPU和内存使

用的情况。

15.远程连接程序——telnet

Windows自带的纯中文界面的远程连接程序。

16.系统文件检查器——sfc

使用Windows难免会出现系统文件损坏或丢失的毛病,而如果为了几个小小的文件就去重装系统,又

显得稍微麻烦了一些。通过系统文件检查器Sfc.exe,一切都会变得非常简单。


以上16个程序都在系统盘的WINDOWS\SYSTEM32文件夹下。
==================================================================================


17.文件转移向导——migwizWINDOWS\SYSTEM32\usmt文件夹下 

通过它,我们就可以实现系统状态的备份与恢复。

18.系统配置程序——msconfigwindows\pchealth\helpctr\binarie

s文件夹下 


和Windows中的系统配置程序一样,通过这个程序,我们可对系统的一般、system.ini、

win.ini、boot.ini、服务和启动项目进行修改。

ajax 传输表单

function preceping(){
var url = "<%=request.getContextPath()%>/quxian/preCeping.shtml?tp=changyetouzi";
var form = Form.serialize('frmId');
var myAjax = new Ajax.Updater('zongfen',url, {method: 'get', parameters: form});
}


注意prototype的版本

读取factorybean

ClassPathResource s=new ClassPathResource("beans.xml")
XmlBeanFactory x=new XmlBeanFactory(s);
//根路径指定->class文件夹开始找beans.xml

ClassPathXmlApplicationContext cx=new ClassPathXmlApplicationContext("beans.xml");
//根路径指定->class文件夹开始找beans.xml

ApplicationContext c=new FileSystemXmlApplicationContext("beans.xml");
//根路径指定->项目根路径 开始找beans.xml

AfterReturningAdvice

public interface AfterReturningAdvice extends Advice {
void afterReturning(Object returnValue, Method m,Object[] args, Object target) throws Throwable;
}


AfterReturningAdvice直接继承自Advice介面,afterReturning()当中传入的引数有目标方法的返回值、方法实例、引数、与目标物件,afterReturning()方法传回void,若您要中止接下来的应用程式流程,丢出例外是唯一的方式。

1 SQL语句中怎么去掉字段内容右边的空格? SQL SERVER中的是RTRIM( ),ORACLE中呢?
-------------
用法差不多:
SQL> select ltrim(' dfs'),rtrim('dfsdf '),trim(' df df '),ltrim('1112121','1') from dual;

LTRIM('DFS') RTRIM('DFSDF') TRIM('DFDF') LTRIM('1112121','1')
------------ -------------- ------------ --------------------
dfs dfsdf df df 2121

2 SQL SERVER中截取字段内容内容,例如SUBSTRING( fieldname, 1, 2),ORACLE中怎么做?
-------------
用法一样,函数名是substr( fieldname, 1, 2)

3 SQL SERVER中比较日期 select * from table where fieldname>'2005-01-01' ,ORACLE中这样写不行,该怎么写呢?

fieldname是date类型的话,select * from table where fieldname> date '2005-01-01'或者
select * from table where fieldname>to_date('2005-01-01','yyyy-mm-dd')







declare @a varchar(8000)
set @a='aaaa bbb'
select left(@a,charindex(' ',@a)-1)
---测试----
aaaa





declare
i integer:=1;
j integer:=1;
k integer:=1;
cursor c1 is
select t.id,replace(t.name,' ')as realname from bjpuserinfo t where t.name like '% %' and t.accounttype='qiye';
begin
for rec in c1 loop
update bjpuserinfo set name=rec.realname where id=rec.id;
update awardarchive set qiyename=rec.realname where qiyeid=rec.id;
update qiyeinfo set unitname=rec.realname where id=rec.id;
end loop;
end;


正则表达式语法

下面是正则表达式的一些示例:

表达式 匹配
/^\s*$/ 匹配空行。
/\d{2}-\d{5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 标记。

下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:

字符 说明
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。
* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。
+ 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。
? 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。
{n} n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。
{n,} n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。'o{1,}' 等效于 'o+'。'o{0,}' 等效于 'o*'。
{n,m} mn 是非负整数,其中 n <= m。至少匹配 n 次,至多匹配 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。
? 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。
(pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式。
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?=95| 98| NT| 2000)”与“Windows 2000”中的“Windows”匹配,但不与“Windows 3.1”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?!95| 98| NT| 2000)”与“Windows 3.1”中的“Windows”匹配,但不与“Windows 2000”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
x| y xy 匹配。例如,“z| food”与“z”或“food”匹配。“(z| f)ood”与“zood”或“food”匹配。
[xyz] 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。
[^xyz] 反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。
[a-z] 字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。
[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。
\b 匹配一个字边界,即字与空格间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。
\B 非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。
\cx 匹配由 x 指示的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。
\d 数字字符匹配。等效于 [0-9]。
\D 非数字字符匹配。等效于 [^0-9]。
\f 换页符匹配。等效于 \x0c 和 \cL。
\n 换行符匹配。等效于 \x0a 和 \cJ。
\r 匹配一个回车符。等效于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 制表符匹配。与 \x09 和 \cI 等效。
\v 垂直制表符匹配。与 \x0b 和 \cK 等效。
\w 匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。
\W 任何非字字符匹配。与“[^A-Za-z0-9_]”等效。
\xn 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码。
\num 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。
\nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,那么 n 是反向引用,后面跟 m。如果前面的条件均不存在,那么当 n m 是八进制数 (0-7) 时,\nm 匹配八进制转义码 nm
\nml n 是八进制数 (0-3),ml 是八进制数 (0-7) 时,匹配八进制转义码 nml
\un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。

onpopup

/**//*
** ==================================================================================================
** 类名:CLASS_MSN_MESSAGE
** 功能:提供类似MSN消息框
** 示例:
---------------------------------------------------------------------------------------------------

var MSG = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有1封消息","今天请我吃饭哈");
MSG.show();

---------------------------------------------------------------------------------------------------
** 作者:ttyp
** 邮件:ttyp@21cn.com
** 日期:2005-3-18
** ==================================================================================================
**/


/**//*
* 消息构造
*/
function CLASS_MSN_MESSAGE(id,width,height,caption,title,message,target,action){
this.id = id;
this.title = title;
this.caption= caption;
this.message= message;
this.target = target;
this.action = action;
this.width = width?width:200;
this.height = height?height:120;
this.timeout= 150;
this.speed = 20;
this.step = 1;
this.right = screen.width -1;
this.bottom = screen.height;
this.left = this.right - this.width;
this.top = this.bottom - this.height;
this.timer = 0;
this.pause = false;
this.close = false;
this.autoHide = true;
}

/**//*
* 隐藏消息方法
*/
CLASS_MSN_MESSAGE.prototype.hide = function(){
if(this.onunload()){

var offset = this.height>this.bottom-this.top?this.height:this.bottom-this.top;
var me = this;

if(this.timer>0){
window.clearInterval(me.timer);
}

var fun = function(){
if(me.pause==false||me.close){
var x = me.left;
var y = 0;
var width = me.width;
var height = 0;
if(me.offset>0){
height = me.offset;
}

y = me.bottom - height;

if(y>=me.bottom){
window.clearInterval(me.timer);
me.Pop.hide();
} else {
me.offset = me.offset - me.step;
}
me.Pop.show(x,y,width,height);
}
}

this.timer = window.setInterval(fun,this.speed)
}
}

/**//*
* 消息卸载事件,可以重写
*/
CLASS_MSN_MESSAGE.prototype.onunload = function() {
return true;
}
/**//*
* 消息命令事件,要实现自己的连接,请重写它
*
*/
CLASS_MSN_MESSAGE.prototype.oncommand = function(){
//this.close = true;
this.hide();
window.open("http://www.baidu.com");

}
/**//*
* 消息显示方法
*/
CLASS_MSN_MESSAGE.prototype.show = function(){

var oPopup = window.createPopup(); //IE5.5+

this.Pop = oPopup;

var w = this.width;
var h = this.height;

var str = "

"
str += ""
str += ""
str += ""
str += ""
str += ""
str += ""
str += ""
str += ""
str += ""
str += "
" + this.caption + ""
str += "×
"
str += "
" + this.title + "

"
str += ""
str += "
"
str += "
"
str += "
"

oPopup.document.body.innerHTML = str;


this.offset = 0;
var me = this;

oPopup.document.body.onmouseover = function(){me.pause=true;}
oPopup.document.body.onmouseout = function(){me.pause=false;}

var fun = function(){
var x = me.left;
var y = 0;
var width = me.width;
var height = me.height;

if(me.offset>me.height){
height = me.height;
} else {
height = me.offset;
}

y = me.bottom - me.offset;
if(y<=me.top){
me.timeout--;
if(me.timeout==0){
window.clearInterval(me.timer);
if(me.autoHide){
me.hide();
}
}
} else {
me.offset = me.offset + me.step;
}
me.Pop.show(x,y,width,height);

}

this.timer = window.setInterval(fun,this.speed)



var btClose = oPopup.document.getElementById("btSysClose");

btClose.onclick = function(){
me.close = true;
me.hide();
}

var btCommand = oPopup.document.getElementById("btCommand");
btCommand.onclick = function(){
me.oncommand();
}
var ommand = oPopup.document.getElementById("ommand");
ommand.onclick = function(){
//this.close = true;
me.hide();
window.open(ommand.href);
}
}
/**//*
** 设置速度方法
**/
CLASS_MSN_MESSAGE.prototype.speed = function(s){
var t = 20;
try {
t = praseInt(s);
} catch(e){}
this.speed = t;
}
/**//*
** 设置步长方法
**/
CLASS_MSN_MESSAGE.prototype.step = function(s){
var t = 1;
try {
t = praseInt(s);
} catch(e){}
this.step = t;
}

CLASS_MSN_MESSAGE.prototype.rect = function(left,right,top,bottom){
try {
this.left = left !=null?left:this.right-this.width;
this.right = right !=null?right:this.left +this.width;
this.bottom = bottom!=null?(bottom>screen.height?screen.height:bottom):screen.height;
this.top = top !=null?top:this.bottom - this.height;
} catch(e){}
}
var MSG1 = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有1封消息","今天请我吃饭哈");
MSG1.rect(null,null,null,screen.height-50);
//MSG1.speed = 10;
//MSG1.step = 5;
//alert(MSG1.top);
MSG1.show();

//同时两个有闪烁,只能用层代替了,不过层不跨框架
//var MSG2 = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有2封消息","好的啊");
//MSG2.rect(100,null,null,screen.height);
//MSG2.show();

今天要在javascript中将一个字符串里的所有的'!@#$',替换成',',结果发现只能替换掉一个,后来查了一下才回忆起来javascript中的replace只能替换掉第一个匹配项。

网上提供的方法主要有两种,一种为通过indexof查看是否还存在匹配项,然后写循环替换,这样也很好。

更好的方案是通过写正则表达式来解决这个问题,replace(/要匹配的字符串/g,要替换的字符串)

网上的帖子大都是互相转载的,居的例子都是一个replace(/\-/g,'!'),但是如果要匹配的字符串长度大于1,究竟怎样写呢。

其实很简单,如果需要匹配的字符串只是字母一类的,例如abcde,那就可以直接replace(/abcde/g,'!')

如果含有特殊字符,需要在特殊字符前面转义(在字符前面加上\),当然每个字符都转义也可以的。例如!@#$,就可以这样写replace(/\!\@\#\$/g,',')


http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#getstarted

//基本循环
declare
my Integer:=100;
begin

for my in 1..4 loop
dbms_output.put_line(my);
end loop;
dbms_output.put_line(my);
end;



//典型游标for 循环
set serveroutput on;
declare
cursor mycur(vartype number)is
select emp_no,emp_zc from cus_emp_basic
where com_no=vartype;
begin
for person in mycur(000627) loop
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
end loop;
end;


FOR r_emp IN (SELECT ename,salary

   FROM emp

   WHERE deptno=p_dept

   ORDER BY ename) LOOP




declare
cursor c1 is
select name,id,password from bjpuserinfo where accounttype='qiye';
begin
for rec in c1 loop
dbms_output.put_line('单位名称:'||rec.name||' ,密码:'||rec.password);
FOR tmp in (select name,fullname,password from bjpuserinfo where accounttype='geren' and parentid=rec.id) loop
dbms_output.put_line('用户名:'||tmp.name||' ,姓名:'||tmp.fullname||' ,密码:'||tmp.password);
end loop;
dbms_output.put_line('==================================');
end loop;
end;





declare
i integer:=1;
j integer:=1;
k integer:=1;
cursor c1 is
select u.id,u.name from bjpuserinfo b,upunit u where u.id=b.upunitid group by u.name,u.id;
begin
for rec in c1 loop
dbms_output.put_line('');
dbms_output.put_line('受理机构'||k||':'||rec.name);k:=k+1;
dbms_output.put_line('');
for tmp in (select name,id,password from bjpuserinfo where accounttype='qiye' and upunitid=rec.id) loop
dbms_output.put_line(' 单位'||i||':'||tmp.name||' ,密码:'||tmp.password);i:=i+1;
for tmp1 in (select name,fullname,password from bjpuserinfo where accounttype='geren' and parentid=tmp.id) loop
dbms_output.put_line(' 用户'||j||':'||tmp1.name||' ,姓名:'||tmp1.fullname||' ,密码:'||tmp1.password);
j:=j+1;
end loop;
j:=1;
end loop;
i:=1;
dbms_output.put_line('====================================================================');
end loop;
end;

Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释 output:表示此参数是可传回的.

with {recompile|encryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

表book的内容如下

编号 书名 价格

001 C语言入门 $30

002 PowerBuilder报表开发 $52

实例1:查询表Book的内容

create proc query_book
as
select * from book
go
exec query_book

实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额

Create proc insert_book

@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output

with encryption ---------加密

as

insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go

执行例子:

declare @total_price money
exec insert_book '003','Delphi 开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go


实例3:设有两个表为Product,Order,其表内容如下:

Product

产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100

Order
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4

请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中

代码如下:

Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Product a inner join Order b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
print 'Fail'
go

数据库之---游标
2007-05-09 17:16

在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。

1.游标和游标的优点

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

2. 游标种类


MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。
(1) Transact_SQL 游标
Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
(2) API 游标
API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
(3) 客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章
中我们主要讲述服务器(后台)游标。

---------------------------------------------------------------------------

这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。

  声明游标

  语法:

CURSOR cursor_name IS select_statement;

  在PL/SQL中游标名是一个未声明变量,不能给游标名赋值或用于表达式中。

  例:

DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN

  在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列 。

  打开游标

  使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:

OPEN cursor_name

  cursor_name是在声明部分定义的游标名。

  例:

OPEN C_EMP;

  关闭游标

  语法:

CLOSE cursor_name

  例:

CLOSE C_EMP;

  从游标提取数据

  从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下:

FETCH cursor_name INTO variable[,variable,...]

  对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。

  例:

SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
CLOSE c_emp;
END

  这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面的程序:

SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
END

  记录变量

  定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。

  记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。

  当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要安全得多。

  例:

SET SERVERIUTPUT ON
DECLARE
R_emp EMP%ROWTYPE;
CURSOR c_emp IS SELECT * FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;

  %ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:

SET SERVERIUTPUT ON
DECLARE
CURSOR c_emp IS SELECT ename,salary FROM emp;
R_emp c_emp%ROWTYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;

  带参数的游标

  与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:

CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

  定义参数的语法如下:

Parameter_name [IN] data_type[{:=|DEFAULT} ]

  与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。

  另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

  在打开游标时给参数赋值,语法如下:

OPEN cursor_name[[,]....];

  参数值可以是文字或变量。

  例:

DECALRE

CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
v_tot_salary EMP.SALARY%TYPE;

BEGIN

OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
OPEN c_emp(r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
CLOSE c_dept;
END;

  游标FOR循环

  在大多数时候我们在设计程序的时候都遵循下面的步骤:

  1、打开游标

  2、开始循环

  3、从游标中取值

  4、检查那一行被返回

  5、处理

  6、关闭循环

  7、关闭游标

  可以简单的把这一类代码称 伪暧糜谘 贰5 褂幸恢盅 酚胝庵掷嘈筒幌嗤 饩褪荈OR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下:

FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;

  下面我们用for循环重写上面的例子:

DECALRE

CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename

v_tot_salary EMP.SALARY%TYPE;

BEGIN

FOR r_dept IN c_dept LOOP
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
FOR r_emp IN c_emp(r_dept.deptno) LOOP
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;

END;

  在游标FOR循环中使用查询

  在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。

DECALRE

 v_tot_salary EMP.SALARY%TYPE;

BEGIN

 FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP
  DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
  v_tot_salary:=0;
  FOR r_emp IN (SELECT ename,salary
   FROM emp
   WHERE deptno=p_dept
   ORDER BY ename) LOOP
  DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
  v_tot_salary:=v_tot_salary+v_salary;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
 END LOOP;

END;

  游标中的子查询

  语法如下:

CURSOR C1 IS SELECT * FROM emp
WHERE deptno NOT IN (SELECT deptno
FROM dept
WHERE dname!='ACCOUNTING');

  可以看出与SQL中的子查询没有什么区别。

  
游标中的更新和删除

  在PL/SQL中依然可以使用UPDATE和DELETE语句更新或删除数据行。显式游标只有在需要获得多行数据的情况下使用。PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。

  UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串,当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。

  语法:

FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..
[nowait]

  在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。

  在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下:

WHERE{CURRENT OF cursor_name|search_condition}

  例:

DELCARE

CURSOR c1 IS SELECT empno,salary
FROM emp
WHERE comm IS NULL
FOR UPDATE OF comm;

v_comm NUMBER(10,2);

BEGIN

FOR r1 IN c1 LOOP

IF r1.salary<500 THEN
v_comm:=r1.salary*0.25;
ELSEIF r1.salary<1000 THEN
v_comm:=r1.salary*0.20;
ELSEIF r1.salary<3000 THEN
v_comm:=r1.salary*0.15;
ELSE
v_comm:=r1.salary*0.12;
END IF;

UPDATE emp;
SET comm=v_comm
WHERE CURRENT OF c1l;

END LOOP;
END

who命令

该命令主要用于查看当前在线上的用户情况。这个命令非常有用。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。

who命令的常用语法格式如下:

who [imqsuwHT] [--count] [--idle]
[--heading] [--help] [--message]
[--mesg] [--version] [--writable] [file] [am i]

所有的选项都是可选的,也就是说可以单独使用who命令。不使用任何选项时,who命令将显示以下三项内容:

login name:登录用户名;

terminal line:使用终端设备;

login time:登录到系统的时间。

如果给出的是两个非选项参数,那么who命令将只显示运行who程序的用户名、登录终端和登录时间。通常这两个参数是“am i”,即该命令格式为:“who am i”。

下面对who命令的常用参数进行说明。

-m 和“who am i”的作用一样,显示运行该程序的用户名。

-q,--count 只显示用户的登录帐号和登录用户的数量,该选项优先级高于其他任何选项。

-s 忽略。主要是用于和其他版本的who命令兼容。

-i,-u,--idle 在登录时间后面显示该用户最后一次对系统进行操作至今的时间,也就是常说的“发呆”时间。其中“.”符号代表该用户在前1秒仍然处于活动状态;“old”则表示该用户空闲已经超过了24小时。

-w,-T--mesg,--message,--writable 和-s选项一样,在登录帐号后面显示一个字符来表示用户的信息状态:

+:允许写信息;

-:不允许写信息;

?:不能找到终端设备。

--help 在标准输出上显示帮助信息。

--version 在标准输出上显示版本信息。

下面介绍who命令的一些基本用法。

如果需要查看在系统上究竟有哪些用户,可以直接使用who命令。

[例17] 查看登录到系统的用户情况

  $ who
  root tty1 Mar 17 13:49
  foxy tty2 Mar 17 13:49
  root tty3 Mar 17 13:49
  bbs ttyp0 Mar 17 13:49 (river.net)

《A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnValue=false; "》

1.CSS将从基础开始建设直到全面替代传统web设计方法。W3C组织创建的CSS技术将替代HTML的表格、font标签、frames以及其它用于表现的HTML元素。

  2.提高页面浏览速度。使用CSS方法,比传统的web设计方法至少节约50%以上的文件尺寸。

  3.缩短改版时间。只要简单的修改几个CSS文件就可以重新设计一个有成百上千页面的站点。

  4.强大的字体控制和排版能力。CSS控制字体的能力比糟糕的FONT标签好多了,有了CSS,我们不再需要用FONT标签或者透明的1 px GIF图片来控制标题,改变字体颜色,字体样式等等。

  5.CSS非常容易编写。你可以象写html代码一样轻松地编写CSS。

  6.提高易用性。使用CSS可以结构化HTML,例如:

标签只用来控制段落,heading标签只用来控制标题,table标签只用来表现格式化的数据等等。你可以增加更多的用户而不需要建立独立的版本。

  7.可以一次设计,随处发布。你的设计不仅仅用于web浏览器,也可以发布在其他设备上,比如PowerPoint。

  8.更好的控制页面布局。不用多说。

  9.表现和内容相分离。将设计部分剥离出来放在一个独立样式文件中,你可以减少未来网页无效的可能。

  10.更方便搜索引擎的搜索。用只包含结构化内容的HTML代替嵌套的标签,搜索引擎将更有效地搜索到你的内容,并可能给你一个较高的评价(ranking)。

  作者:克里斯多佛 主页 http://www.christopherschmitt.com/

// 特殊字符转为Html
public static String toHtml(String s){
if(s == null){
s = "";
return s;
}
s = Replace(s.trim(),"&","&amp;");
s= Replace(s.trim(),"<","<");
s = Replace(s.trim(),">",">");
s = Replace(s.trim(),"\t"," ");
s = Replace(s.trim(),"\r\n","\n");
s = Replace(s.trim(),"\n","
");
s = Replace(s.trim()," "," ");
s = Replace(s.trim(),"'","'");
s = Replace(s.trim(),"\\","\");
return s;
}
/**
* ubb
*/
public static String toUbbHtml(String s){
if(s == null){
s = "";
return s;
}
s = Replace(s,"\n","
");
s = Replace(s," "," ");
s = Replace(s,"'","'");
s = Replace(s,"\\","\");
return s;
}

//逆
public static String unHtml(String s){
s = Replace(s,"
","\n");
s = Replace(s," "," ");
return s;
}

public static String Replace(String source,String oldString,String newString){
StringBuffer output = new StringBuffer();
int lengthOfsource = source.length();//源字符串长度
int lengthOfold = oldString.length();//老字符串长度
int posStart = 0;//开始搜索位置
int pos;//搜索到的老字符串的位置
//source.indexOf(oldString,posStart)检索某子串在字符串postStart以后第一次出现的位置,如果未找到就返回一个-1。
while((pos = source.indexOf(oldString,posStart)) >= 0){//得到字符串的位置(eg:如果有
就执行,没有就跳出,不要处理。)
//将以posStart起始以pos-1结束之间的内容拷贝到另一个字符串中。因为posStar从0开始的。
output.append(source.substring(posStart,pos));//append方法将文本添加到当前StringBuffer对象内容的结尾。
output.append(newString);//替换成新字符串
posStart = pos + lengthOfold;//位置也变为找到了之后的位置,pos为得到第一次出现字符的位置,lengthold为字符的长度
}
if(posStart < lengthOfsource){
//source.substring(posStart)以lengthOfsource开始的字符串拷贝到列一个字符串中
output.append(source.substring(posStart));
}
//这个方法将其内容转换成一个可以被用于输出的字符串对象。它允许操作对应的文本用于输出或数据存储。
return output.toString();
}

indexOf方法:

返回 String 对象内第一次出现子字符串的字符位置。

strObj.indexOf(subString[, startIndex])
参数
strObj
必选项。String 对象或文字。
subString
必选项。要在 String 对象中查找的子字符串。
starIndex
可选项。该整数值指出在 String 对象内开始查找的索引。如果省略,则从字符串的开始处查找。
说明
indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回 -1。

如果 startindex 是负数,则 startindex 被当作零。如果它比最大的字符位置索引还大,则它被当作最大的可能索引。

从左向右执行查找。否则,该方法与 lastIndexOf 相同。

示例
下面的示例说明了 indexOf 方法的用法。

程序代码 程序代码
function IndexDemo(str2){
var str1 = "BABEBIBOBUBABEBIBOBU"
var s = str1.indexOf(str2);
return(s);
}


lastIndexOf 方法:

返回 String 对象中子字符串最后出现的位置。

strObj.lastIndexOf(substring[, startindex])
参数
strObj
必选项。String 对象或文字。
substring
必选项。要在 String 对象内查找的子字符串。
startindex
可选项。该整数值指出在 String 对象内进行查找的开始索引位置。如果省略,则查找从字符串的末尾开始。
说明
lastIndexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回 -1。

如果 startindex 是负数,则 startindex 被当作零。如果它比最大字符位置索引还大,则它被当作最大的可能索引。

从右向左执行查找。否则,该方法和 indexOf 相同。

下面的示例说明了 lastIndexOf 方法的用法:

程序代码 程序代码
function lastIndexDemo(str2)
{
var str1 = "BABEBIBOBUBABEBIBOBU"
var s = str1.lastIndexOf(str2);
return(s);
}


substring 方法:

返回位于 String 对象中指定位置的子字符串。

程序代码 程序代码
strVariable.substring(start, end)
"String Literal".substring(start, end)


参数

start
指明子字符串的起始位置,该索引从 0 开始起算。
end
指明子字符串的结束位置,该索引从 0 开始起算。
说明

substring 方法将返回一个包含从 start 到最后(不包含 end )的子字符串的字符串。

substring 方法使用 start 和 end 两者中的较小值作为子字符串的起始点。例如, strvar.substring(0, 3) 和 strvar.substring(3, 0) 将返回相同的子字符串。

如果 start 或 end 为 NaN 或者负数,那么将其替换为0。

子字符串的长度等于 start 和 end 之差的绝对值。例如,在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的长度是 3。

示例
下面的示例演示了 substring 方法的用法。

程序代码 程序代码
function SubstringDemo(){
var ss; // 声明变量。
var s = "The rain in Spain falls mainly in the plain..";
ss = s.substring(12, 17); // 取子字符串。
return(ss); // 返回子字符串。
}

一个是标准输出 一个是标准错误输出 在不同的容器,System.out.println() 和System.err.println()会输出 不同的文件中。

System.err.println()不能被重定向


System.out.println() 是标准输出 System.err.println() 是标准错误输出 默认情况下都是将结果输出到控制台,不过可以对其进行重定向从而改变其默认输出的方式。

〈script>
function toBreakWord(intLen){
var obj=document.getElementById("strT");
var strContent=obj.innerHTML;
var strTemp="";
while(strContent.length>intLen){
strTemp+=strContent.substr(0,intLen)+"〈br>";
strContent=strContent.substr(intLen,strContent.length);
}
strTemp+=strContent;
obj.innerHTML=strTemp;
}
〈/script>

〈div id=strT>要控制的字符串。。。。〈/div>

〈script>
if(document.getElementById &&amp;amp;amp; !document.all) toBreakWord(54);//每行54个字符换行
〈/script>

 
Copyright 2005-2007. Hello Wiki designed by Fen, Blogger Templates by Blogcrowds.