??xml version="1.0" encoding="utf-8" standalone="yes"?> 作者:佚名 来自Q未?/p>
有时候JDBCq行得不够快Q这使得有些E序员用数据库相关的存储过E。作Z个替代方案,可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高速度? 存储q程的最单的形式是包含一pdSQL语句的过E,这些语句放在一起便于在同一个地方管理也可以提高速度。Statement cd以包含一pdSQL语句Q因此允许在同一个数据库事务执行所有的那些语句而不是执行对数据库的一pd调用? 使用扚w处理功能涉及下面的两个方法: 如果你正在用Statement 那么addBatch Ҏ可以接受一个通常的SQL语句Q或者如果你在用PreparedStatement Q那么也可以什么都不向它增加。executeBatch Ҏ执行那些SQL语句q返回一个int值的数组Q这个数l包含每个语句媄响的数据的行数。如果将一个SELECT语句或者其他返回一个ResultSet的SQL语句攑օ扚w处理中就会导致一个SQLException异常? 关于java.sql.Statement 的简单范例可以是Q? Statement stmt = conn.createStatement(); PreparedStatement 有些不同Q它只能处理一部分SQL语法Q但是可以有很多参数Q因此重写上面的范例的一部分可以得C面的l果Q? // 注意q里没有DELETE语句 User[ ] users = ...; 如果你不知道你的语句要运行多次Q那么这是一个很好的处理SQL代码的方法。在不用批量处理的情况下,如果d50个用P那么性能有影响Q如果某个h写了一个脚本添加一万个用户Q程序可能变得很p糕。添加批处理功能可以帮助提高性能Q而且在后面的那种情况下代码的可读性也更好?/p>
在《外部数据库的连接原理》一讲中我们说过QODBC提供对多U数据库的支持,如dBase、Access、MS SQL
Server及OracleQ也是说运用ODBC数据源中所提供的连接代码,我们可以实现对多U数据库的连接。以q接Access数据库ؓ例,ODBC数据源连接文本的格式是:
“Driver={数据库驱动程序};Dbq=数据库文??br /> 在以上连接文本中Q如果数据库跟程序在同一目录下,或者用变量DefaultDir指定了数据库所在目录,则数据库文g可以不用全\径名Q如下即可:
“ODBC;DBQ=MSAccess.mdb;Driver={Microsoft Access Driver (*.mdb)};?br /> 如下也可Q?br /> “ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft
Access Driver (*.mdb)};?br /> 如果数据库跟E序不在同一目录下,或者没有用变量DefaultDir指定数据库所在目录,则数据库文g需要用全\径名Q如下:
“ODBC;DBQ=E:\Quake III Arena\MSAccess.mdb;Driver={Microsoft Access
Driver (*.mdb)};?br /> 以上所说的是连接Access数据库的格式Q那么连接其他数据库的ODBC数据源连接文本又是怎样的?q接不同cd的数据库要用不同的对应驱动E序Q没忘记吧!不同的驱动程序当然它们的参数l合也就不同了,每一U不同驱动程序都有其特定的的参数形式Q?br />
⑴、MS Access ODBC DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{Microsoft Access Driver (*.mdb)}
☆、参敎ͼDbq 讄|实际路径文g名称
☆、例句:
“Driver={Microsoft Access Driver
(*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass; ?br /> cdBase ODBC DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{Microsoft dBASE Driver (*.dbf)}
☆、参敎ͼDbq 讄|实际路径文g名称
☆、例句:
“Driver={Microsoft dBASE Driver
(*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf; ?br /> ⑶、Oracle ODBC DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{Microsoft ODBC for Oracle}
☆、参敎ͼDbq 讄|实际路径文g名称
☆、例句:
“Driver={Microsoft ODBC for
Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass; ?br /> MS SQL Server DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{SQL Server};
☆、参敎ͼServer 讄|服务器名U?br /> ☆、参敎ͼDatabase 讄|数据表名U?br /> ☆、参敎ͼUid 讄|用户名称
☆、参敎ͼPwd 讄|密码
☆、例句:
“Driver={SQL
Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass; ?br /> ⑸、MS Text Driver DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{Microsoft Text Driver (*.txt; *.csv)}
☆、参敎ͼDbq 讄|实际路径文g名称
☆、例句:
“Driver={Microsoft Text Driver (*.txt;
*.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist Security
Info=False; ?br /> VVisual Foxpro DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{Microsoft Visual FoxPro Driver}
☆、参敎ͼSourceType 讄|DBC
☆、参敎ͼSourceDB 讄|实际路径文g名称
☆、例句:
“Driver={Microsoft Visual FoxPro
Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;”?br />
⑺、MySQL DSNless q接Q?br /> ☆、参敎ͼDriver 讄|{mysql}
☆、参敎ͼdatabase 讄|数据表名U?br /> ☆、参敎ͼuid 讄|用户名称
☆、参敎ͼpwd 讄|密码
☆、例句:
“driver={mysql};
database=yourdatabase;uid=username;pwd=password;option=16386?br /> *******************************************************************
SQL语言介?br />
在上一讲中我们介绍了连接外部数据库的方法,那么q接之后怎样对外部数据库q行d、显C、增删、更新、查询等操作呢?q些操作需要通过外部数据库等对象调用SQL指o才能完成?br /> ㈠、什么是SQL语言
SQLQStructure Query LangugeQ结构化查询语言Q是一U数据库专用的计机语言Q不是Oracle、MS
SQL
、Access、MySQL或其他公司的数据库,也不数据库建立在大型主机或个h计算ZQ都可以使用SQL语言来访问和修改数据库的内容。虽然不同公司的数据库Y件多多少会增加一些专属的SQL语法Q但大体上,它们q是遵@ASNIQ美国国家标准协会)制定的SQL标准。因为SQL语言h易学习及阅读{特性,所以SQL逐渐被各U数据库厂商采用Q而成ZU共通的标准查询语言。只要你学会SQLQ即可操作各U数据库如Visual
Foxpro、Access、dBase{等。MQSQL语言是各U数据库都可以用的数据库查询语a?br /> SQL语言不仅仅具有查询数据库的功能,而且可以Ҏ据库完成选取、增删、更C跌{{各U操作?br /> ㈡、SQL语言的组?br /> SQL语言是由命oQ函敎ͼ、子句、运符、加d数及通配W等l成Q分q如下:
1、命?br /> SQL的命令可分成数据定义语言与数据操作语aQ数据定义语a可用来徏立新的数据库、数据表、字D及索引{,本教E不予介l;另一为数据操作语aQ可用来建立查询表、排序、筛选数据、修攏V增删等动作。数据定义语a命o常用的有选择、添加、删除和修改q四U:
⑴、命令:SELECT
中文意思:选择
说明Q用于找出合乎条件的记录
c命令:INSERT
中文意思:插入
说明Q用于增加一W记录或合ƈ两个数据?br /> ⑶、命令:UPDATE
中文意思:更新
说明Q用于更正合乎条件的记录
命令:DELETE
中文意思:删除
说明Q用于删除合乎条件的记录
2、子?br /> 子句是用于设定命令要操作的对象(卛_敎ͼQSQL所用的子句如下Q?br /> ⑴、子句:FROM
中文意思:数据?br /> 说明Q用于指定数据表
c子句:WHERE
中文意思:条g
说明Q用于设定条?br /> ⑶、GROUP BY
中文意思:分组Q合qӞ
说明Q用于设定分l?br /> ORDER BY
中文意思:排序
说明Q用于设定输出的序及字D?br /> 3、运符
子句参数中的q算W子句构成不同的语法格式,如“字D?='100'”、“字D?>'100'”等。运符又分逻辑q算W与比较q算W?br /> ◇逻辑q算W如下:
⑴、运符QAND
中文意思:q且
说明Q逻辑?br /> c运符QOR
中文意思:或?br /> 说明Q逻辑?br /> ⑶、运符QNOT
中文意思:取反
说明Q逻辑非或逻辑?br /> ◇比较运符如下Q?br /> ⑴、运符Q?lt; 说明:于
c运符Q≤ 说明Q小于等?br /> ⑶、运符Q≥ 说明Q大于等?br /> 运符Q?gt; 说明Q大?br /> ⑸、运符Q? 说明Q等?br /> V运符Q?lt;> 说明Q不{于
⑺、运符QBETWEEN 说明Q用于设定范图b中文意思:?..之间
⑅R运符QLIKE 说明Q用于通配讑֮ 中文意思:如同
⑹{运符QIN 说明Q用于集合设定 中文意思:?..之内
4、加d?br /> 加d数常常运用在命o的参CQ如Q“SELECT SUMQ数学)QAVGQ数学) FROM 成W单”?br /> ⑴、加d敎ͼAVG
中文意思:q_
说明Q用于求指定条g的^均?br /> c加d敎ͼCOUNT
中文意思:数量
说明Q用于求指定的数?br /> ⑶、加d敎ͼSUM
中文意思:?br /> 说明Q用于求指定条g的和
加d敎ͼMAX
中文意思:最大?br /> 说明Q用于求指定条g的最大?br /> ⑸、加d敎ͼMIN
中文意思:最?br /> 说明Q用于求指定条g的最?br /> 5、通配W?br /> ⑴、通配W:% 意义QQ何长度的字符Ԍ包括0Q?br /> c通配W:_ 意义Q下划线表示M一个字W?br /> ⑶、通配W:[] 意义Q中括号表示某个范围内的一个字W?br /> 在下一讲将说明SQL语言是怎样把命令(函数Q、子句、运符、及加d数等l合在一L?br />
*************************************************************************
嵌入式SQL的应用?br />
SQL语句可以单独在数据库pȝ本n中执行,但如果运用在其他~程工具所~制的程序中Q一般不能单独执行,而要把SQL语句嵌入到高U语aQ如易语aQ中使用Q通过高语言的命令和Ҏ来调用之Q此时SQLUCؓ嵌入式SQL。调用SQL语句的程序称为宿ȝ序,在易语言中一般是把SQL语句作ؓ宿主E序的唯一参数来直接处理。嵌入式SQL在用上有一些规定,在易语言中目前的版本规定如下Q?br /> ⑴、在E序中要区分SQL语句和宿主语a的语句。在易语a中好区分Q因为SQL语句形式是英文的Q而易语言是中文的Q但在实际应用时仍然有可能会混ؕQ所以易语言要把SQL语句转化为文本型才能调用Q即嵌入式SQL语句两边要用双引h标示?br /> c允许SQL语句使用宿主E序的变量,但用时要将宿主E序的变量跟外部数据库中表格的字D名区别开来,区别Ҏ如下Q?br /> ①、在易语a中要变量类型{化ؓ文本型变量才能被SQL文本相加使用Q比如下面的例子中有一个叫“数?”的整数cd变量Q插入到SQL文本中是q样表达Q?br /> 外部数据?.查询 (“select * from chj where ” + l合?.内容 Q ?” + 到文本?数字1))
②、包含字D名的SQL文本两边加双引号Q变量名不能在双引号内,如上例?br /> ⑶、要字D名跟字D值区别开来,区别Ҏ如下Q?br /> ①、对于文本类型的字段Q在其字Dg边要加上?”号标示其文本|代表语法是:字段名称=‘文本值’。如下:
外部数据?.查询 (“select * from chj where 姓名='山大??
又如下面“查扄辑框.内容”中的字D值是文本型,嵌入式SQL语句如下Q?br /> 外部数据?.查询 (“select * from chj where 姓名==” + ?” + 查找~辑?内容 Q?br />??
②、对于数字类型的字段Q在SQL语句中表C其字段|两边不加W号标示Q代表语法是Q字D名U?数字倹{如下两例:
外部数据?.查询 (“select * from chj where ” + l合?.内容 Q ?” + 查找~辑?内容)
外部数据?.查询 (“select * from chj where 学号=17?
③、对于日期时间类型的字段Q在其字Dg边要加上?”号标示其时间|代表语法是:字段名称=#旉?。如下两例:
外部数据?.查询 (“select * from chj where 入学旉 BETWEEN #2001-01-01# and
#2002-01-01#?
外部数据?.查询 (“select * from chj where ” + l合?.内容 Q ?” + ?” +
查找~辑?内容 Q ??
④、也可以SQL语句中的字段名(其是中文名Q可用中括号括住Q如Q[字段名]?br />
SQL语句要用半角输入法输入,否则可能会出错?br /> 那么在易语言中怎样调用SQL语句呢?一般是在外部数据库对象Q控Ӟ的方法中调用Q试概括如下Q?br /> ⑴、对外部数据库进行查询的Ҏ?br /> 对外部数据库的查询就是在对外部数据库不加~辑改动的前提下Q只通过记录集来Ҏ据库q行昄、查询、筛选、排序和记录集的合ƈ{操作?br /> 所有查询类的方法v源于下面q个语句Q其他查询类语句是对q个语句的调用(此语句作ؓ唯一的参敎ͼQ该语句如下Q?br /> 外部数据库.查询 Q查询类SQL语句Q?br /> 也可q样表达Q?br /> 外部数据库.查询 Q“SELECT...FROM...[WHERE]...[GROUP BY]...[ORDER BY]... ”)
该方法是对当前被打开数据库进行数据查询,q回的结果称为“记录集句柄”(卌录集的标讎ͼ。注意当不再使用此记录集Ӟ必须使用“关闭记录集”将其关闭,如果p|Q返?。在易语a中,以上语句等同于记录集句柄以作ؓ其他查询c语句的参数。ؓ了该参数在所有子E序中都能应用,我们一般把它设|ؓ整数型全局变量Qƈ其D|如下:
记录集句?外部数据库.查询 Q查询类SQL语句Q?br /> ׃易语a要把SQL语句转化为文本型才能调用Q所以嵌入式SQL语句两边要有双引P例句Q?br /> 记录集句柄 = 外部数据?.查询 (“select * from chj ?
※ “chj”是外部数据库中一个表的名U?br /> 又如Q欲得到排序的记录集Q应象下面这栯|
记录集句柄 = 外部数据?.查询 (“SELECT * FROM chj ORDER BY 语文 DESC?
现将外部数据库控件中其他的查询类Ҏ列D如下Q?br /> ①、外部数据库Q重新查询 (记录集句柄) 卻I
外部数据库.重新查询 Q外部数据库Q查询 (查询cSQL语句Q)
例句Q外部数据库1.重新查询 (外部数据?.查询 (“select * from chj ?)
②、外部数据库Q首记录前 (记录集句柄) 卻I
外部数据库.首记录前 Q外部数据库Q查询 (查询cSQL语句Q)
例句Q外部数据库1.首记录前 (记录集句?
③、外部数据库Q尾记录后 (记录集句柄)
④、外部数据库Q到首记录 (记录集句柄)
⑤、外部数据库Q到记录 (记录集句柄)
⑥、外部数据库Q到前一记录 Q记录集句柄Q?br /> ⑦、外部数据库Q到后一记录 Q记录集句柄Q?br /> ⑧、外部数据库Q读 Q记录集句柄Q字D名U或位置Q?br /> 例句Q语文编辑框.内容 Q 到文本 (外部数据?.读?记录集句? “语文?)
c对外部数据库进行编辑的Ҏ?br /> 所谓对外部数据库的~辑Q就是变更改动外部数据库本nQ包括添加、更新、删除等Q对数据库进行编辑不必通过记录集。所有非查询cSQL语句都嵌入下面这个语句来执行Q?br /> 外部数据库.执行 Q非查询cSQL语句Q?br /> ①、添加记录,其语法如下:
外部数据库.执行 Q“insert into 表名U?字段1,字段2...) values (字段?,字段?...) ”)
例句Q?br /> 外部数据?.执行 (“INSERT INTO chj ” + ?学号,姓名,语文,数学,p)” + “ valueS ” +
?” + 学号~辑?内容 Q ?'” + 姓名~辑?内容 Q ?,'” + 语文~辑?内容 Q ?,'” +
数学~辑?内容 Q ?,'” + p~辑?内容 Q ?)?
②、更新记录,其语法如下:
外部数据库.执行 Q“UPDATE 表名UWSET 字段1=字段?Q字D?=字段?...WHERE 条g式”)
例句Q?br /> 外部数据?.执行 (“UPDATE chj SET 学号=” + ?” + 学号~辑?内容 Q ?,” + “姓?”?br /> Q ?” + 姓名~辑?内容 Q ?,” + “语?” + ?” + 语文~辑?内容 Q ?,” + “数?”?br /> Q ?” + 数学~辑?内容 Q ?,” + “英?” + ?” + p~辑?内容 Q ? ” + “WHERE
姓名=” + ?” + 姓名1 Q ? ” + “AND 语文=” + 语文1 Q “AND 数学=” + 数学1 Q “AND
p=” + p1 Q “AND 学号=” + 学号1)
③、删除记录,其语法如下:
外部数据库.执行 Q“DELETE * FROM 表名UWWHERE 条g式”)
例句Q?br /> 外部数据库.执行 Q“外部数据库1.执行 (“DELETE * FROM chj ” + “WHERE 姓名=” + ?” +
姓名1 Q ? ” + “AND 语文=” + 语文1 Q “AND 数学=” + 数学1 Q “AND p=” + p1 Q?br /> “AND 学号=” + 学号1)”)
]]>
扚w处理JDBC语句提高处理速度
· addBatch(String) Ҏ
· executeBatchҎ
stmt.insert("DELETE FROM Users");
stmt.insert("INSERT INTO Users VALUES("rod", 37, "circle")");
stmt.insert("INSERT INTO Users VALUES("jane", 33, "triangle")");
stmt.insert("INSERT INTO Users VALUES("freddy", 29, "square")");
int[] counts = stmt.executeBatch();
PreparedStatement stmt = conn.prepareStatement("INSERT INTO Users VALUES(?,?,?)");
for(int i=0; i<users.length; i++) {
stmt.setInt(1, users[i].getName());
stmt.setInt(2, users[i].getAge());
stmt.setInt(3, users[i].getShape());
stmt.addBatch( );
}
int[ ] counts = stmt.executeBatch();
]]>
全文索引—CONTAINS语法
全文索引——CONTAINS 语法
我们通常?WHERE 子句中?CONTAINS Q就象这PSELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')?
我们通过例子来学习,假设有表 studentsQ其中的 address 是全文本索的列?br />1. 查询住址在北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引hh?br />
2. 查询住址在河北省的学?br />SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词l,在单引号里还要用双引hh?br />
3. 查询住址在河北省或北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作W?包括 AND QAND NOTQOR )?br />
4. 查询?'南京? 字样的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'nanjing NEAR road' )
remark: 上面的查询将q回包含 'nanjing road'Q?nanjing east road'Q?nanjing west road' {字L地址?br /> A NEAR BQ就表示条gQ?A 靠近 B?br />
5. 查询?'? 开头的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"hu*"' )
remark: 上面的查询将q回包含 'hubei'Q?hunan' {字L地址?br /> C?*Q不?%?br />
6. cM加权的查?br />SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )
remark: ISABOUT 是这U查询的关键字,weight 指定了一个介?0~1之间的数Q类似系?我的理解)。表CZ同条件有不同的侧重?br />
7. 单词的多态查?br />SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )
remark: 查询返回包?'street'Q?streets'{字L地址?br /> 对于动词返回它的不同的时态,如:dryQ将q回 dryQdriedQdrying {等?img src ="http://www.aygfsteel.com/machilansing/aggbug/64048.html" width = "1" height = "1" />
]]>
Microsoft公司Z么还要添加这个技术呢?
那么存储q程与一般的SQL语句有什么区别呢?
存储q程的优点:
1.存储q程只在创造时q行~译Q以后每ơ执行存储过E都不需再重新编译,而一般SQL语句每执行一ơ就~译一?所以用存储过E可提高数据库执行速度?br /> 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,DeleteӞQ可此复杂操作用存储过E封装v来与数据库提供的事务处理l合一起用?br /> 3.存储q程可以重复使用,可减数据库开发h员的工作?br /> 4.安全性高,可设定只有某此用hhҎ定存储过E的使用?br /> 存储q程的种c:
1.pȝ存储q程Q以sp_开?用来q行pȝ的各设?取得信息.相关理工作,
如 ?sp_help是取得指定对象的相关信?br /> 2.扩展存储q程 以XP_开?用来调用操作pȝ提供的功?br /> exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储q程,q是我们所指的存储q程
常用格式
Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
outputQ表C此参数是可传回?br /> with {recompile|encryption}
recompile:表示每次执行此存储过E时都重新编译一?br /> encryption:所创徏的存储过E的内容会被加密
?
表book的内容如?br /> ~号 书名 h
001 C语言入门 $30
002 PowerBuilder报表开发 ?$52
实例1:查询表Book的内容的存储q程
create proc query_book
as
select * from book
go
exec query_book
实例2:加入一W记录到表book,q查询此表中所有书c的总金?br /> Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(~号,书名Qh| Values(@param1,@param2,@param3)
select @param4=sum(h) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 控g开发指?,$100,@total_price
print '总金额ؓ'+convert(varchar,@total_price)
go
存储q程?U传回?
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批ơ程式中用变量接?而recordset则传回到执行Ҏ的客L中 ?
实例3Q设有两个表为Product,Order,其表内容如下Q?br /> Product
产品~号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order
产品~号 客户名 ?客户订金
001 南山区 ?$30
002 |湖区 ?$50
003 宝安区 ?$4
请实现按~号接条?两个表q接成一个时表,该表只含~号.产品?客户?订金.总金?
总金?订金*订数,临时表放在存储过E中
代码如下:
Create proc temp_sale
as
select a.产品~号,a.产品名称,b.客户?b.客户订金,a.客户订数* b.客户订金 as总金?br /> into #temptable from Product a inner join Order b on a.产品~号=b.产品~号
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go
存储q程介绍
一、先介绍一下什么是存储q程
存储q程是利用SQL Server所提供的Tranact-SQL语言所~写的程序。Tranact-SQL语言是SQL Server提供专ؓ设计数据库应用程序的语言Q它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系l中的Pro-SQL和Informix的数据库pȝ能够中的Informix-4GL语言一栗这c语a主要提供以下功能Q让用户可以设计出符合引用需求的E序Q ?
1)、变量说明 ?
2)、ANSI兼容的SQL命o(如Select,Update?)
3)、一般流E控制命?if…else…、while?)
4)、内部函敊W?
二、存储过E的书写格 ?
CREATE PROCEDURE [拥有?]存储q程名[;E序~号]
[(参数#1,…参?1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS E序行 ?
其中存储q程名不能超q?28个字。每个存储过E中最多设?024个参敊W?
(SQL Server 7.0以上版本),参数的用方法如?
@参数名 ?数据cd [VARYING] [=内定值] [OUTPUT]
每个参数名前要有一个“@”符?每一个存储过E的参数仅ؓ该程序内部?参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可用。 ?
[=内定值]相当于我们在建立数据库时讑֮一个字D늚默认|q里是ؓq个参数讑֮默认倹{[OUTPUT]是用来指定该参数是既有输入又有输出值的Q也是在调用了q个存储q程Ӟ如果所指定的参数值是我们需要输入的参数Q同时也需要在l果中输出的Q则该项必须为OUTPUTQ而如果只是做输出参数用,可以用CURSORQ同时在使用该参数时Q必L定VARYING和OUTPUTq两个语句。 ?
例子:
CREATE PROCEDURE order_tot_amt @o_id int,@p_tot int output AS
SELECT @p_tot = sum(Unitprice*Quantity)
FROM orderdetails
WHERE ordered=@o_id
例子说明:
该例子是建立一个简单的存储q程order_tot_amt,q个存储q程Ҏ用户输入的定单IDL(@o_id),由定单明l表(orderdetails)中计该定单销售总额[单h(Unitprice)*数量(Quantity)],q一金额通过@p_totq一参数输出l调用这一存储q程的程序 ?
三、在SQL Server中执行存储过E ?
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amtq一存储q程Q以计算出定单编号ؓ1的定单销售金额,我们定义@tot_amt出参敎ͼ用来承接我们所要的l果