??xml version="1.0" encoding="utf-8" standalone="yes"?> and datediff(day, date1,'2009-2-03')>=0 and date1<='2009-2-03' SQL Server推荐使用 SET 而不?SELECT 对变量进行赋倹{?br />
当表辑ּq回一个值ƈ对一个变量进行赋值时Q推荐?SET Ҏ(gu)?/p>
下表列出 SET ?SELECT 的区别。请特别注意U色部分?
聚集索引对于那些l常要搜索范围值的列特别有效。用聚集烦(ch)引找到包含第一个值的行后Q便可以保包含后箋索引值的行在物理盔R。例如,如果应用E序执行的一个查询经常检索某一日期范围内的记录Q则使用聚集索引可以q速找到包含开始日期的行,然后(g)索表中所有相?c)行,直到到达l束日期。这h助于提高此类查询的性能。同P如果对从表中(g)索的数据q行排序时经常要用到某一列,则可以将该表在该列上聚集Q物理排序)(j)Q避免每ơ查询该列时都进行排序,从而节省成本?
当烦(ch)引值唯一Ӟ使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID ? emp_id 查找特定雇员的最快速的Ҏ(gu)Q是? emp_id 列上创徏聚集索引? PRIMARY KEY U束
使用非聚集烦(ch)?
非聚集烦(ch)引与课本中的索引cM。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位|。烦(ch)引中的项目按索引键值的序存储Q而表中的信息按另一U顺序存储(q可以由聚集索引规定Q。如果在表中未创集烦(ch)引,则无法保证这些行hM特定的顺序?
与用书中烦(ch)引的方式怼QMicrosoft® SQL Server™ 2000 在搜索数据值时Q先寚w聚集索引q行搜烦(ch)Q找到数据值在表中的位|,然后从该位置直接(g)索数据。这佉K聚集索引成ؓ(f)_匚w查询的最x(chng)法,因ؓ(f)索引包含描述查询所搜烦(ch)的数据值在表中的精位|的条目。如果基表用聚集烦(ch)引排序,则该位置集键|否则Q该位置为包含行的文件号、页号和槽号的行 ID (RID)。例如,对于? emp_id 列上有非聚集索引的表Q如要搜索其雇员 ID (emp_id)QSQL Server ?x)在索引中查找这样一个条目,该条目精列出匹配的 emp_id 列在表中的页和行Q然后直接{到该该行?nbsp;
-------------------------------------------------------分割U?------------------------------------------------------
在工作中遇见?jin)SQL性能问题,最后在同事的帮助下解决?jin)此问?是通过?strong>聚集索引的方式解决的!
原来的SQL中有如下的where语句:
and datediff(day, date1,'2009-1-01')<=0
and date1>='2009-1-01'
]]>
set
select
同时对多个变量同时赋?/td>
不支?/td>
支持
表达式返回多个值时
出错
返回的最后一个Dl变?/font>
表达式未q回?/td>
变量被赋null?/td>
变量保持原?/font>
下面以具体示例来说明问题Q?/p>
create table chinadba1(
userid int ,
addr varchar(128)
)
go
insert into chinadba1(userid,addr) values(1,'addr1')
insert into chinadba1(userid,addr) values(2,'addr2')
insert into chinadba1(userid,addr) values(3,'addr3')
go
表达式返回多个值时Q?SET 赋?
declare @addr varchar(128)
set @addr = (select addr from chinadba1)
/*
--出错信息?br />
服务? 消息 512Q?16Q状?1Q行 2
子查询返回的值多于一个。当子查询跟随在 =?=?lt;?lt;=?gt;?gt;= 之后Q或子查询用作表辑ּӞq种情况是不允许的?br />
*/
go
表达式返回多个值时Q?SELECT 赋?
declare @addr varchar(128)
select @addr = addr from chinadba1
print @addr --l果集中最后一?addr 列的?br />
--l果: addr3
go
表达式未q回值时Q?SET 赋?
declare @addr varchar(128)
set @addr = '初始?
set @addr = (select addr from chinadba1 where userid = 4 )
print @addr --null?
go
表达式未q回值时Q?SELECT 赋?
declare @addr varchar(128)
set @addr = '初始?
select @addr = addr from chinadba1 where userid = 4
print @addr --保持原?br />
go
需要注意的是,SELECT 也可以将标量子查询的Dl变量,如果标量子查询不q回|则变量被|ؓ(f) null 倹{?br /> 此时?使用 SET 赋值是完全相同?br /> Ҏ(gu)量子查询的概念大家应该都觉得陌生QD个例子就能说?/p>
declare @addr varchar(128)
set @addr = '初始?
--select addr from chinadba1 where userid = 4 为标量子查询语句
select @addr = (select addr from chinadba1 where userid = 4)
print @addr --null?br />
go
转自Q?font face="Verdana">http://blog.csdn.net/shouyenet1/archive/2008/12/13/3511818.aspx
在查询的时候,有这L(fng)一个需?br />
数据库内容如下:(x)
iD description
1 TableClassA.getName()
2 TableClassB.getName(),exception
3 TableClassC,getName()
4 TableClassD,getName().null
我想查询输入以下l果Q?br />
iD description
1 TableClassA
2 TableClassB
3 TableClassC
4 TableClassD
?qing)查询的l果?h,前的内容
SQL如下
select id,
case
when (CHARINDEX(',',description)>0) and (CHARINDEX('.',description)>0)
then --在这个做?jin)判?如同时包??则判??那个在前
case
when CHARINDEX(',',description)>CHARINDEX('.',description) then left(description,CHARINDEX('.',description)-1)
when CHARINDEX(',',description)<CHARINDEX('.',description) then left(description,CHARINDEX(',',description)-1)
end
when (CHARINDEX(',',description)>0) then left(description,CHARINDEX(',',description)-1)
when (CHARINDEX('.',description)>0) then left(description,CHARINDEX('.',description)-1)
else description
end
as description
from tablename
字符串函数对二进制数据、字W串和表辑ּ执行不同的运。此cdC用于CHAR、VARCHAR?BINARY?和VARBINARY 数据cd以及(qing)可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和W(xu)HERE 子句以及(qing)表达式中使用字符串函数?br />
常用的字W串函数有:(x)
一、字W{换函?/strong>
1、ASCII()
q回字符表达式最左端字符的ASCII 码倹{在ASCIIQ)(j)函数中,U数字的字符串可不用‘’括v来,但含其它字符的字W串必须?#8216;’括v来用,否则?x)出错?br />
2、CHAR()
ASCII 码{换ؓ(f)字符。如果没有输? ~ 255 之间的ASCII 码|CHARQ)(j) q回NULL ?br />
3、LOWER()和UPPER()
LOWER()字W串全部转ؓ(f)写QUPPER()字W串全部转ؓ(f)大写?br />
4、STR()
把数值型数据转换为字W型数据?br />
STR (<float_expression>[Qlength[Q?<decimal>]])
length 指定q回的字W串的长度,decimal 指定q回的小C数。如果没有指定长度,~省的length gؓ(f)10Q?decimal ~省gؓ(f)0?br />
当length 或者decimal 值时Q返回NULLQ?br />
当length 于数点左边(包括W号位)(j)的位数时Q返回length ?Q?br />
先服从length Q再取decimal Q?br />
当返回的字符串位数小于length Q左边补空根{?br />
二、去I格函数
1、LTRIM() 把字W串头部的空格去掉?br />
2、RTRIM() 把字W串N的空格去掉?br />
三、取子串函数
1、left()
LEFT (<character_expression>Q?<integer_expression>)
q回character_expression 左v integer_expression 个字W?br />
2、RIGHT()
RIGHT (<character_expression>Q?<integer_expression>)
q回character_expression 双v integer_expression 个字W?br />
3、SUBSTRING()
SUBSTRING (<expression>Q?<starting_ position>Q?length)
q回从字W串左边Wstarting_ position 个字Wvlength个字W的部分?br />
四、字W串比较函数
1、CHARINDEX()
q回字符串中某个指定的子串出现的开始位|?br />
CHARINDEX (<’substring_expression’>Q?<expression>)
其中substring _expression 是所要查扄字符表达式,expression 可ؓ(f)字符串也可ؓ(f)列名表达式。如果没有发现子Ԍ则返? 倹{?br />
此函C能用于TEXT 和IMAGE 数据cd?br />
2、PATINDEX()
q回字符串中某个指定的子串出现的开始位|?br />
PATINDEX (<’%substring _expression%’>Q?<column_ name>)其中子串表达式前后必L癑ֈ?#8220;%”否则q回gؓ(f)0?br />
与CHARINDEX 函数不同的是QPATINDEX函数的子串中可以使用通配W,且此函数可用于CHAR?VARCHAR 和TEXT 数据cd?br />
五、字W串操作函数
1、QUOTENAME()
q回被特定字W括h的字W串?br />
QUOTENAME (<’character_expression’>[Q?quote_ character]) 其中quote_ character 标明括字W串所用的字符Q缺省gؓ(f)“[]”?br />
2、REPLICATE()
q回一个重复character_expression 指定ơ数的字W串?br />
REPLICATE (character_expression integer_expression) 如果integer_expression gؓ(f)负|则返回NULL ?br />
3、REVERSE()
指定的字符串的字符排列序颠倒?br />
REVERSE (<character_expression>) 其中character_expression 可以是字W串、常数或一个列的倹{?br />
4、REPLACE()
q回被替换了(jin)指定子串的字W串?br />
REPLACE (<string_expression1>Q?<string_expression2>Q?<string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2?br />
4、SPACE()
q回一个有指定长度的空白字W串?br />
SPACE (<integer_expression>) 如果integer_expression gؓ(f)负|则返回NULL ?br />
5、STUFF()
用另一子串替换字符串指定位|、长度的子串?br />
STUFF (<character_expression1>Q?<start_ position>Q?<length>Q?lt;character_expression2>)
如果起始位置或长度gؓ(f)负,或者v始位|大于character_expression1 的长度,则返回NULL 倹{?br />
如果length 长度大于character_expression1 ?start_ position 以右的长度,则character_expression1 只保留首字符?br />
六、数据类型{换函?/strong>
1、CAST()
CAST (<expression> AS <data_ type>[ length ])
2、CONVERT()
CONVERT (<data_ type>[ length ]Q?<expression> [Q?style])
1Qdata_type为SQL Serverpȝ定义的数据类型,用户自定义的数据cd不能在此使用?br />
2Qlength用于指定数据的长度,~省gؓ(f)30?br />
3Q把CHAR或VARCHARcd转换如INT或SAMLLINTq样的INTEGERcd、结果必L带正h负号的数倹{?br />
4QTEXTcd到CHAR或VARCHARcd转换最多ؓ(f)8000个字W,即CHAR或VARCHAR数据cd是最大长度?br />
5QIMAGEcd存储的数据{换到BINARY或VARBINARYcdQ最多ؓ(f)8000个字W?br />
6Q把整数D{换ؓ(f)MONEY或SMALLMONEYcdQ按定义的国家的货币单位来处理,如h民币、美元、英镑等?br />
7QBITcd的{换把非零D{换ؓ(f)1Qƈ仍以BITcd存储?br />
8Q试图{换到不同长度的数据类型,?x)截短{换值ƈ在{换值后昄“+”Q以标识发生?jin)这U截断?br />
9Q用CONVERTQ)(j)函数的style 选项能以不同的格式显C日期和旉。style 是将DATATIME 和SMALLDATETIME 数据转换为字W串时所选用的由SQL Server pȝ提供的{换样式编P不同的样式编h不同的输出格式?br />
七、日期函?/strong>
1、day(date_expression)
q回date_expression中的日期?br />
2、month(date_expression)
q回date_expression中的月䆾?br />
3、year(date_expression)
q回date_expression中的q䆾?br />
4、DATEADD()
DATEADD (<datepart>Q?<number>Q?<date>)
q回指定日期date 加上指定的额外日期间隔number 产生的新日期?br />
5、DATEDIFF()
DATEDIFF (<datepart>Q?<date1>Q?<date2>)
q回两个指定日期在datepart 斚w的不同之处,即date2 过date1的差距|其结果值是一个带有正负号的整数倹{?br />
6、DATENAME()
DATENAME (<datepart>Q?<date>)
以字W串的Ş式返回日期的指定部分此部分。由datepart 来指定?br />
7、DATEPART()
DATEPART (<datepart>Q?<date>)
以整数值的形式q回日期的指定部分。此部分由datepart 来指定?br />
DATEPART (ddQ?date) {同于DAY (date)
DATEPART (mmQ?date) {同于MONTH (date)
DATEPART (yyQ?date) {同于YEAR (date)
8、GETDATE()
以DATETIME 的缺省格式返回系l当前的日期和时间?/p>
SQLServer旉日期函数详解,SQLServer,旉日期,
1. 当前pȝ日期、时?
select getdate()
2. dateadd 在向指定日期加上一D|间的基础上,q回新的 datetime ?/font>
例如Q向日期加上2?
select dateadd(day,2,'2004-10-15') --q回Q?004-10-17 00:00:00.000
3. datediff q回跨两个指定日期的日期和时间边界数?/font>
select datediff(day,'2004-09-01','2004-09-18') --q回Q?7
select datediff(day,'2004-09-18','2004-09-01') --q回Q?17
4. datepart q回代表指定日期的指定日期部分的整数?/font>
SELECT DATEPART(month, '2004-10-15') --q回 10
5. datename q回代表指定日期的指定日期部分的字符?/font>
SELECT datename(weekday, '2004-10-15') --q回Q星期五
6. day(), month(),year() --可以与datepart对照一?/font>
select 当前日期=convert(varchar(10),getdate(),120)
,当前旉=convert(varchar(8),getdate(),114)
select datename(dw,'2004-10-15')
select 本年W多周=datename(week,'2004-10-15')
,今天是周?datename(weekday,'2004-10-15')
函数 参数/功能
GetDate( ) q回pȝ目前的日期与旉
DateDiff (interval,date1,date2) 以interval 指定的方式,q回date2 与date1两个日期之间的差?
date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日?
DatePart (interval,date) q回日期date中,interval指定部分所对应的整数?
DateName (interval,date) q回日期date中,interval指定部分所对应的字W串名称
参数 interval的设定值如下:(x)
?~?写(Sql ServerQ?(Access ?ASP) 说明
Year Yy yyyy q?1753 ~ 9999
Quarter Qq q ?1 ~ 4
Month Mm m ? ~ 12
Day of year Dy y 一q的日数,一q中的第几日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日数Q一周中的第几日 1-7
Week Wk ww 周,一q中的第几周 0 ~ 51
Hour Hh h ? ~ 23
Minute Mi n 分钟0 ~ 59
Second Ss s U?0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999
access ?asp 中用date()和now()取得pȝ日期旉Q其中DateDiff,DateAdd,DatePart也同是能用于
Access和asp中,q些函数的用法也cM
举例Q?/font>
1.GetDate() 用于sql server :select GetDate()
2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')q回gؓ(f) 514592 U?/font>
DateDiff('d','2005-07-20','2005-7-25 22:56:32')q回gؓ(f) 5 ?/font>
3.DatePart('w','2005-7-25 22:56:32')q回gؓ(f) 2 x(chng)期一(周日?Q周六ؓ(f)7)
DatePart('d','2005-7-25 22:56:32')q回gؓ(f) 25?5?/font>
DatePart('y','2005-7-25 22:56:32')q回gؓ(f) 206卌一q中W?06?/font>
DatePart('yyyy','2005-7-25 22:56:32')q回gؓ(f) 2005?005q?
具体的语法:(x)
日期函数用来操作DATETIME 和SMALLDATETIME cd的数据,执行术q算。与其它函数一P可以?/font>
Select 语句的Select 和W(xu)here 子句以及(qing)表达式中使用日期函数。其使用Ҏ(gu)如下Q?/font>
日期函数参数Q其中参C数应不同的函数而不同?/font>
·DAYQ)(j)
DAYQ)(j) 函数语法如下Q?/font>
DAY Q?lt;date_expression>Q?/font>
DAYQ)(j) 函数q回date_expression 中的日期倹{?/font>
·MONTHQ)(j)
MONTHQ)(j) 函数语法如下Q?/font>
MONTH (<date_expression>)
MONTHQ)(j) 函数q回date_expression 中的月䆾倹{?/font>
与DAYQ)(j) 函数不同的是QMONTHQ)(j) 函数的参Cؓ(f)整数Ӟ一律返回整数?Q即SQL Server 认ؓ(f)?/font>
?900 q? 月?/font>
·YEARQ)(j)
YEARQ)(j) 函数语法如下Q?/font>
YEAR Q?lt;date_expression>Q?/font>
YEARQ)(j) 函数q回date_expression 中的q䆾倹{?/font>
提醒Q在使用日期函数Ӟ其日期值应?753q到9999q之_(d)q是SQL Serverpȝ所能识别的日期?/font>
_(d)否则?x)出现错误?/font>
·DATEADDQ)(j)
DATEADDQ)(j) 函数语法如下Q?/font>
DATEADD Q?lt;datepart>Q?<number>Q?<date>Q?/font>
DATEADDQ)(j) 函数q回指定日期date 加上指定的额外日期间隔number 产生的新日期。参?#8220;datepart
” 在日期函Cl常被用,它用来指定构成日期类型数据的各组Ӟ如年、季、月、日、星期等?/font>
其取值如?-9 所C:(x)
·DATEDIFFQ)(j)
DATEDIFFQ)(j) 函数语法如下Q?/font>
DATEDIFFQ)(j) Q?lt;datepart>Q?<date1>Q?<date2>Q?/font>
DATEDIFFQ)(j) 函数q回两个指定日期在datepart 斚w的不同之处,即date2 过date1的差距|?/font>
l果值是一个带有正负号的整数倹{针对不同的datepartQ?DATEDIFFQ)(j)函数所允许的最大差距g
一P如:(x)datepart 为second ӞDATEDIFFQ)(j) 函数所允许的最大差距gؓ(f)68Q?qdatepart ?/font>
millisecond ӞDATEDIFFQ)(j) 函数所允许的最大差距gؓ(f)24 ?0 时30 ?3 U?47 毫秒?/font>
·DATENAMEQ)(j)
DATENAMEQ)(j) 函数语法如下Q?/font>
DATENAME Q?lt;datepart>Q?<dateQ?gt;
DATENAMEQ)(j) 函数以字W串的Ş式返回日期的指定部分此部分。由datepart 来指定?/font>
·DATEPARTQ)(j)
DATEPARTQ)(j) 函数语法如下Q?/font>
DATEPART Q?lt;datepart>Q?<date>Q?/font>
DATEPARTQ)(j) 函数以整数值的形式q回日期的指定部分。此部分由datepart 来指定?/font>
DATEPART QddQ?dateQ?{同于DAY QdateQ?/font>
DATEPART QmmQ?dateQ?{同于MONTH QdateQ?/font>
DATEPART QyyQ?dateQ?{同于YEAR QdateQ?/font>
·GETDATEQ)(j)
GETDATEQ)(j) 函数语法如下Q?/font>
GETDATEQ)(j)
GETDATEQ)(j) 函数以DATETIME 的缺省格式返回系l当前的日期和时_(d)它常作ؓ(f)其它函数或命令的?/font>
C用?
在开发数据库应用中,l常?x)遇到处理时间的问题Q如查询指定旉的记录等。下面就q些常见的问?/font>
Q结合自q一些经验,和大家探讨一下这c问题?
首先介绍一下,SQL Server里处理时间的几个主要函数的用法:(x)
getdate()函数Q取得系l当前的日期和时间。返回gؓ(f)datetimecd的?
用法Qgetdate()
例子Q?
select getdate() as dte,dateadd(day,-1,getdate()) as nowdat
输出l果Q?
dte nowdat
1999-11-21 19:13:10.083 1999-11-20 19:13:10.083
(1 row(s) affected)
datepart()函数Q以整数的Ş式返回时间的指定部分?
用法Qdatepart(datepart,date)
参数说明Qdatepart时要q回的时间的部分Q常用取值year、month、day、hour、minute?
date是所指定的时间?
例子Q?
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
输出l果Q?
Month Number
11
(1 row(s) affected)
dateadd()函数Q通过l指定的旉的指定部分加上一个整数gq回一个新旉倹{?
用法Qdateadd(datepart,number,date)
参数说明Qdatepart(同上Q?
date(同上)
number要增加的|整型Q可正可负,正D回date之后的时间|负D回date
之前的时间?
例子Q?
select getdate() as today
select dateadd(day,-1,getdate())
select dateadd(day,1,getdate())
输出Q?
today
1999-11-21 19:42:41.410
(1 row(s) affected)
yesterday
1999-11-20 19:42:41.410
(1 row(s) affected)
tomorrow
1999-11-22 19:42:41.410
(1 row(s) affected)
datediff()函数Q返回两个时间以指定旉部分来计的差倹{返回整数倹{如1991-6-12?991-6-21
之间以天
来算相差9?1998-6-12?999-6-23按年相?q_(d)1999-12-1?999-3-12按月相?个月
用法Qdatediff(darepart,date1,date2)
参数说明QdatepartQ同?
date1、date2(同上date)
例子Q?
select datediff(month,'1991-6-12','1992-6-21') as a
以上两句都是?srcTbl 的数据插入到 destTblQ但两句又有区别的:(x)
列出所有的表名:
select name from sysobjects where type='u'
列出表中列名:
select name from syscolumns where id=object_id(tablename)
DECLARE -- 定义
BEGIN -- 执行部分
EXCEPTION -- 例外处理
END; -- l束
set
serveroutput on;
DECLARE v_ename VARCHAR2(
5
);
BEGIN
SELECT ename INTO v_ename FROM emp WHERE empno=&no;
dbms_output.put_line(
'¹ÍÔ±Ãû:'
|| v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(
'please input correct employees no!'
);
END;
/
<<outer>> <<inner>>
执行特定的操?/span>
CREATE or replace
PROCEDURE update_sal(nameVARCHAR2,newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal=newsal WHERE lower(ename)=lower(name);
END;
/
调用Q?/span>
exec update_sal(
'SMITH'
,
10
)
call update_sal(
'SMITH'
,
800
)
q回特定数据
CREATE
or
replace
FUNCTION annual_income(nameVARCHAR2)
RETURNNUMBERIS
annual_salary NUMBER(
7
,
2
);
BEGIN
SELECT sal*
12
+ nvl(comm,
0
) into annual_salary FROM emp WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
/
调用 :
SQL> VAR income NUMBER
SQL> CALL annual_income('scott') INTO : income;
调用完成?/span>
SQL> print income
INCOME
----------
36000
逻辑l合相关的过E和函数
--
包规?/span>
CREATE
or
replace
PACKAGE emp_pkg IS
PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER);
FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER;
END;
--
包体
CREATE
or
replace
PACKAGE
BODY emp_pkg IS
PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal WHERE lower(ename) = lower(name);
END;
FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER
IS
annual_salary NUMBER(
7
,
2
);
BEGIN
SELECT sal *
12
+ nvl(comm,
0
) into annual_salary FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
END;
/
调用Q?/span>
SQL> call emp_pkg .update_sal('SMITH',1500);
Or
SQL> VAR income NUMBER
SQL> CALL emp_pkg
.
annual_income('scott') INTO : income;
调用完成?/span>
SQL> print income
INCOME
----------
36000
是隐含执行的存储q程?/span>
create
or
replace
trigger update_cascade
afterupdateof deptno on dept
foreachrow
begin
update emp set deptno=:new.deptno
where deptno=:old.deptno;
end;
/
LONG(32760 字节 ) ?/span> VARCHAR2(32767 字节 ) cMQ定义变长的字符?/span>
LONG RAW 用于定义变长的二q制数据 (32760 字节 )
BINARY_INTEGER 定义整数Q范围ؓ(f)Q?/span> -2147483647~2147483647 ( 非表列?/span> )
BOOLEAN ?/span> TRUE/FALSE/NULL ( 非表列?/span> )
BINARY_FLOAT/BINARY_DOUBLE Q?/span> ORACLE10 所?/span>
Identifier [CONSTANT] datatype [not null] [:= | default expr]
例如Q?/span> v_valid BOOLEAN NOT NULL DEFAULT FALSE;
C_tax_rate CONSTANT NUMBER(3,2):=0.03;
V_ename emp.ename%TYPE;
cM于高U语a中的l构
DECLARE
TYPE emp_record_type ISRECORD(
name emp.ename%TYPE,
salary emp.sal%TYPE,
title emp.job%TYPE
);
emp_record emp_record_type;
BEGIN
SELECT ename,sal,job INTO emp_record FROM emp WHERE empno=
7788
;
dbms_output.put_line(
'
雇员?/span>
'
||emp_record.name);
end;
/
cM于高U语a中的数组Q下标可以ؓ(f)?/span> , 个数无限制?/span>
DECLARE
TYPE ename_table_type ISTABLEOF emp.ename%TYPE
INDEXBYBINARY_INTEGER;
ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(-
1
) FROM emp WHERE empno=
7788
;
dbms_output.put_line(
'
雇员?/span>
'
||ename_table(-
1
));
end;
/
cM于高U语a中的数组Q下标不可以Q个数无限制?/span>
CREATE
OR
REPLACE
TYPE emp_type ASOBJECT(
nameVARCHAR2(
10
),
salary NUMBER(
6
,
2
),
hiredate DATE
);
/
CREATEORREPLACETYPE emp_array ISTABLEOF emp_type;
/
CREATEORREPLACEtable department(
deptno NUMBER(
2
),
dname VARCHAR2(
10
),
employee emp_array
)nestedtable employee storeas employee;
VARRAY cM于嵌套表Q它可以作ؓ(f)表列和对象类型属性的数据cdQ个数有限制?/span>
CREATE
OR
REPLACE
TYPE article_type ASOBJECT(
title VARCHAR2(
30
),
pubdate DATE
);
/
CREATEORREPLACETYPE article_array ISVARRAY(
20
) OF article_type;
/
CREATEORREPLACEtable author(
idNUMBER(
6
),
nameVARCHAR2(
10
),
article article_array
);
用于存放数值指针的变量。得应用程序共享相同对象,从而降低占用空间?/span>
游标变量
DECLARE
TYPE c1 ISREFCURSOR;
emp_cursor c1;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
OPEN emp_cursor FOR
SELECT ename, sal FROM emp ;
--WHERE deptno = 10;
LOOP
FETCH emp_cursor
INTO v_ename, v_sal;
EXITWHEN emp_cursor%NOTFOUND;
dbms_output.put_line(v_ename);
ENDLOOP;
CLOSE emp_cursor;
END;
/
Z(jin)׃n相同对象Q可以用 ref 引用对象cd?/span>
CREATE OR REPLACE TYPE home_type AS OBJECT(
street VARCHAR2(50),city VARCHAR2(20),
state VARCHAR2(20),zipcode VARCHAR2(6),
owner VARCHAR2(10)
);
/
CREATE TABLE homes OF home_type;
INSERT INTO homes VALUES(' gu北\ 12 ?/span> ',' 呼和特 ',' 内蒙 ','010010',' 马鸣 ');
INSERT INTO homes VALUES(' gu北\ 13 ?/span> ',' 呼和特 ',' 内蒙 ','010010',' U斌 ');
CREATE TABLE person(
id NUMBER(6) PRIMARY KEY,
name VARCHAR2(10), addr REF home_type
);
INSERT INTO person SELECT 1,' 马鸣 ',ref(p) FROM homes p WHERE p.owner=' 马鸣 ';
内部 : CLOB ?/span> BLOB ?/span> NCLOB Q外部:(x) BFILE ?/span>
var namevarchar2(
10
)
begin
select ename into :namefrom emp
where empno=
7788
;
end;
/
print name
.createcharname length
10
begin
select ename into :namefrom emp
where empno=
7788
;
end;
/
text_to.put_line(:name);