sql except 2个表比较出来的sql结果集合并处理

请教问题出在哪?odbc已配置但是运行结果却是java.sql.SQLExcept_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:240,577贴子:
请教问题出在哪?odbc已配置但是运行结果却是java.sql.SQLExcept收藏
package 练习;
import java.sql.*;public class Example11_1 {public static void main(String[] args) {CSResultS/*try {Class.forName(&sun.jdbc.odbc.JdbcOdbcDriver&);} catch (ClassNotFoundException e) {System.out.print(e);}*/try {con = DriverManager.getConnection(&jdbc:odbc:myData&,&&,&&);sql = con.createStatement();rs = sql.executeQuery(&SELECT * FROM goods WHERE price&30000&);while (rs.next()){String number = rs.getString(1);String name = rs.getString(2);Date date = rs.getDate(&madeTime&);double price = rs.getDouble(&price&);System.out.printf(&%-4s&,number);System.out.printf(&%-6s&,name);System.out.printf(&%-15s&,date.toString());System.out.printf(&%6s\n&,price);}con.close();}catch (SQLException e) {System.out.println(e);}}}
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或您的位置: >
SQL Server表误删记录如何恢复
学习标签:
本文导读:在项目开发中,我们都会有可能碰到误删了数据,而这个数据库之前没有任何备份。这个时候的数据该如何恢复呢?下面介绍SQL Server中的表误删记录恢复的方法
一、从事务日志恢复
这个恢复需要有两个前提条件:
1、至少有一个误删除之前的数据库完全备份。
2、数据库的恢复模式(Recovery mode)是&完整(Full)&。
恢复的方法
a) 备份当前数据库的事务日志:BACKUP LOG [数据库名] TO disk= N'备份文件名' WITH NORECOVERY
b) 恢复一个误删除之前的完全备份:RESTORE DATABASE [数据库名] FROM DISK = N'完全备份文件名' WITH NORECOVERY,& REPLACE
c) 将数据库恢复至误删除之前的时间点:RESTORE LOG [数据库] FROM& DISK = N'第一步的日志备份文件名' WITH&& STOPAT = N'误删除之前的时间点' , RECOVERY
如果第1个前提条件不存在,第2个前提条件存在,需要借助第三方工具。
二、借助第三方工具恢复
1、Log Explorer
能够恢复数据,但是不支持 SQL Server2008
(1)、打开log explorer file=&attach log file-&选择服务器和登陆方式-&connect-&选择数据库-&attach-&左面对话框中browse-&view log-&就可以看到log记录了。
(2)、点击&View DDL Commands&里面就有很多drop table 命令
(3)、点击下面的&undo&按钮是生成表结构的语句(create table ....)
(4)、点击下面的&Salvage&按钮是生成插入语句的(insert into ...values....)
(5)、右键log记录 undo transation-&选择保存文件名和路径-&然后打开该文件到查询分析器里执行T-sql代码就可以了
2、SysTools SQL Recovery
支持SQL Server 2008,但需要购买,Demo版并没有数据恢复功能。
3、Recovery for SQL Server
虽然也是商业软件,需要购买,但Demo版可以恢复数据,只要数据库文件不超过24Gb。
4、如果数据量比较大的话,使用磁带机和集群的话,安装正版的VERITAS
该 软件重要的新功能:
(1)、灾难恢复演习(Disaster Recovery Fire Drill)--能够自由测试、规划和检验灾难恢复计划,而不会中断生产过程。
(1)、集群模拟器(Cluster Simulator)--可测试应用故障切换方案,以验证应用的可用性,确认应用是否根据计划的故障切换策略和应用需求,迁移到最适当的服务器。
(1)、全局集群选件(Global Cluster Option)--当可用性要求从本地迁移到广域灾难恢复时,能够快速、轻松地升级到任何体系结构。
(1)、即时访问复制数据--在复制数据的同时,能够即时访问数据,只占用客户的部分可用存储容量。
(1)、卷复制顾问工具(Volume Replicator Advisor)--准确地分析带宽需求,确保应用得到优化。
该软件的缺点是:价格会比较贵。
三、几点恢复数据心得
1、平时需要做好双机热备份,日备份,月备份,年备份,数据复制,异常记录等工作,在数据丢失的情况下才能做到心中不急
2、如果硬盘损害错误,或者误删除数据库的时候,可以考虑用Easyrecovery或者Recover4all等软件恢复删除或者受到损害的文件,再恢复数据。
3、如果实在遇到自然因素,网络又断开了复制操作的情况下,建议只有手工&造取&一批数据出来弥补丢失数据,一般选取类似纬度(如时间、区域等)的数据
您可能感兴趣
一月好评排行榜SQL语句大全_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&SQL语句大全
SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,SQL查询语句就是一个典型的例子,无论是高级查询还是低级查询,SQL查询语句的需求是最频繁的。作用于数据库相关学科数据库原理、设计教程
创建之前判断该数据库是否存在
if exists (select * from sysdatabases where name='databaseName')
drop database databaseName
Create DATABASE databasename
on primary-- 默认就属于primary文件组,可省略
/*--数据文件的具体描述--*/
name=‘databasename_data’,-- 主数据文件的逻辑名称
filename=‘'所存位置:\databasename_data.mdf’, -- 主数据文件的物理名称
size=数值mb, --主数据文件的初始大小
maxsize=数值mb, -- 主数据文件增长的最大值
filegrowth=数值%--主数据文件的增长率
/*--日志文件的具体描述,各参数含义同上--*/
name='databasename_log', -- 日志文件的逻辑名称
filename='所存目录:\databasename_log.ldf', -- 日志文件的物理名称
size=数值mb, --日志文件的初始大小
filegrowth=数值mb--日志文件的增长值
)drop database databasename--- 创建备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始备份
BACKUP DATABASE pubs TO testBackcreate table tabname(col1 type1 [not null] [primary key] identity(起始值,递增量)
,col2 type2 [not null],..)--primary key为主键 identity表示递增数量
根据已有的表创建新表:
use 原数据库名
select * into 目的数据库名.dbo.目的表名 from 原表名(使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition onlycreate sequence SIMON_SEQUENCE
minvalue 1 -- 最小值
maxvalue 999 -- 最大值
start with 1 -- 开始值
increment by 1 -- 每次加几
cache 20;drop table tabname--这是将表连同表中信息一起删除但是日志文件中会有记录delete from table_name-这是将表中信息删除但是会保留这个表Alter table table_name add column_name column_type [default 默认值]--在表中增加一列,[]内的内容为可选项Alter table table_name drop column column_name--从表中删除一列Alter table tabname add primary key(col)
说明:删除主键:Alter table tabname drop primary key(col)create [unique] index idxname on tabname(col…。)
删除索引:drop index idxname on tabname
注:索引是不可更改的,想更改必须删除重新建。create view viewname as select statement
删除视图:drop view viewname(1) 数据记录筛选:
sql=&select * from 数据表 where=字段值 order by[desc]&(按某个字段值降序排列。默认升序ASC)
sql=&select * from 数据表 wherelike '%字段值%' order by 字段名 [desc]&
sql=&select top 10 * from 数据表 where=字段值 order by 字段名 [desc]&
sql=&select top 10 * from 数据表 order by 字段名 [desc]&
sql=&select * from 数据表 wherein ('值1','值2','值3')&
sql=&select * from 数据表 wherebetween 值1 and 值2&
(2) 更新数据记录:
sql=&update 数据表 set=字段值 where 条件表达式&
sql=&update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式&
(3) 删除数据记录:
sql=&delete from 数据表 where 条件表达式&
sql=&delete from 数据表& (将数据表所有记录删除)
(4) 添加数据记录:
sql=&insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)&
sql=&insert into 目标数据表 select * from 源数据表& (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG() 得出一个表格栏平均值
COUNT(*;) 对数据行数的统计或对某一栏有值的数据行数统计
MAX() 取得一个表格栏最大的值
MIN() 取得一个表格栏最小的值
SUM() 把数据栏的值相加
引用以上函数的方法:
sql=&select sum() as 别名 from 数据表 where 条件表达式&
set rs=conn.excute(sql)
用 rs(&别名&) 获取统计的值,其它函数运用同上。
查询去除重复值:select distinct * from table1
(6) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
(7) 单列求和:
SELECT SUM() FROM 数据表查询数据库中含有同一这字段的表:
select name from sysobjects where xtype = 'u' and id in(select id from syscolumns where name = 's3')
根据出生日期可以算出年龄:
select datediff(year,scrq,'2013') as 年龄 from page_shsjgrgl
根据当前年份自动算出年龄
select datediff(year,csny,cast(YEAR(GETDATE()) as char))
select year(djsj) from page_shsjgrgl
select month(djsj) from page_shsjgrgl
select day(djsj) from page_shsjgrgl
在同一数据库中复制表结构:
select * into a from b where 1&&1
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'aa' 中的标识列插入显式值。
set identity_insert aa ON----设置打开,
批量插入:
insert into aa(Customer_ID, ID_Type, ID_Number) select Customer_ID, ID_Type, ID_Number from TC
set identity_insert aa OFF---关闭
不同数据库之间的复制:
复制结构:
select * into test.dbo.b from GCRT.dbo.page_shsjgrgl where 1&&1
复制内容:
insert into test.dbo.b(xm,ssdq) select xm,ssdq from GCRT.dbo.page_shsjgrgl
查看数据库中所有的数据表表名:
select name from SysObjects where type='u'
查看数据库中所有表含有同一字段的表:
select name from sysobjects where xtype = 'u' and id in(select id from syscolumns where name = '同一字段')
查看数据表中的所有字段:
select name from Syscolumns where id=object_id('表名')
查询数据库时前10条记录:
select top 10 * from td_areacode order by newid()
修改字段类型:
ALTER TABLE 表名 ALTER COLUMN 字段名 varchar(30) NOT NULL
use ZHJIANGJGYL
declare @temp nvarchar(30)
set @temp = 'ZWI4'
select hllx from page_yljg_zyry where hllx not in(
case @temp when ''
then ''
else b1 end
select * from TD_Code where page_en='page_yljg_zyry' and B2='ZWI'
) s where s.b1 !=
case @temp when '' then '' else @temp end
更改数据库表字段类型:
alter table page_shsjgrgl alter column s1 intA:UNION
UNION 运算符通过组合其他两个结果表(例如TABLE1 和TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随UNION 一起使用时(即UNION ALL),不消除重复行。两种情况下,的每一行不是来自TABLE1 就是来自TABLE2。
B: EXCEPT
EXCEPT 运算符通过包括所有在TABLE1 中但不在TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。
C:INTERSECT
INTERSECT 运算符通过只包括TABLE1 和TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当ALL 随INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。A、left outer join:
左(左连接):既包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):既包括的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全:不仅包括符号的匹配行,还包括两个连接表中的所有记录。判断数据库是否存在
if exists (select*fromsysdatabaseswherename= '数据库名')
dropdatabase[数据库名]
判断表是否存在
if not exists (select * from sysobjects where [name] = '表名' and xtype='U')
--这里创建表
判断存储过程是否存在
if exists (select*fromsysobjectswhereid = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
dropprocedure[名]
判断临时表是否存在
if object_id('tempdb..#临时表名')isnot null
droptable#名
判断视图是否存在
--SQL Server 2000
IF EXISTS (SELECT*FROMsysviewsWHEREobject_id = '[dbo].[视图名]'
--SQL Server 2005
IF EXISTS (SELECT*FROMsys.viewsWHEREobject_id = '[dbo].[视图名]'
判断函数是否存在
if exists (select*fromdbo.sysobjectswhereid = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF'))
dropfunction[dbo].[函数名]
获取创建信息
SELECT[name],[id],crdateFROMsysobjectswherextype='U'
xtype 的表示参数类型,通常包括如下这些 C =CHECK约束 D = 默认值或DEFAULT约束 F =FOREIGNKEY约束 L =FN =IF = 内嵌表函数 P =PK =PRIMARYKEY约束(类型是K) RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR =U = 用户表 UQ =UNIQUE约束(类型是K) V = 视图 X = 扩展存储过程 */
判断列是否存在
if exists(select*fromsyscolumnswhereid=object_id('表名') andname='列名')
altertable表名dropcolumn列名
判断列是否自增列
if columnproperty(object_id('table'),'col','IsIdentity')=1
print '自增列'
print '不是自增列'
SELECT*FROMsys.columnsWHEREobject_id=OBJECT_ID('表名')
AND is_identity=1
判断表中是否存在索引
if exists(select*fromsysindexeswhereid=object_id('表名') andname='索引名')
print '存在'
print '不存在
查看数据库中对象
SELECT*FROMsysobjectsWHEREname='对象名'
select * from table(所要查询的表名) where coloum(条件)复制表
(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1&&1
法二:select top 0 * into b from a
(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(x, y, z) select d,e,
跨数据库之间表的拷贝
(具体数据使用) (Access可用)
insert into b(x, y, z) select d,e,f from a in ‘具体数据库’ where 条件
例子:。.from b in '&&Server.MapPath(&.&&&\data.mdb& &&' where..
(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b 或者: select a,b,c from a where a IN (1,2,3)
显示文章最后时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
外连接查询
(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
在线视图查询
select * from (Select a,b,c FROM a) T where t.a & 1;
between的用法
between为查询某字段的指定范围,限制查询数据范围时包括了边界值,not between不包括边界值
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
删除主表没有的信息
两张关联表delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1
四表联查问题
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
日程安排提前五分钟
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&5
一条sql 搞定数据库页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段= a.主键字段 order by a.排序字段
前10条记录
select top 10 * from table1 where 范围
选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等。)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
派生结果表
包括所有在TableA 中但不在TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA except (select a from tableB) except (select a from tableC)
随机取出10条数据
select top 10 * from tablename order by newid()
随机选择记录
select newid()
删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
列出数据库里的表名
select name from sysobjects where type='U'
列出表里的所有的
select name from syscolumns where id=object_id('TableName')
列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
初始化表table1
TRUNCATE TABLE table1
选择从10到15的记录
select top 5 * from (select top10 * from (select top 15 * from table order by id asc) table_别名 order by id desc) table_2 order by id
数据类型转换
declare @numid int
declare @id varchar(50)
set @numid=2005
set @id=convert(varchar,@numid)
通过上述语句完成Int转换成varchar,其他转换类似,可参看convert函数1=1,1=2的使用
在SQL语句组合时用的较多
“where 1=1”是表示选择全部 “where 1=2”全部不选,
if @strWhere !='
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
我们可以直接写成
set @strSQL='select count(*) as Total from tablename where 1+1'
if(@strWhere!='')
{set @strSQL=@strSQL+’and’+strWhere}
收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
压缩数据库
dbcc shrinkdatabase(dbname)
转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
修复数据库
Alter DATABASE [dvbbs] SET SINGLE_USER
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
Alter DATABASE [dvbbs] SET MULTI_USER
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的数据库名
Select @LogicalFileName = 'tablename_log', --名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
Select @OriginalSize = size
FROM sysfiles
Where name = @LogicalFileName
Select 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
Where name = @LogicalFileName
Create TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
Select @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes & DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (Select size FROM sysfiles Where name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) & @NewSize
BEGIN -- Outer loop.
Select @Counter = 0
WHILE ((@Counter & @OriginalSize / 16) AND (@Counter & 50000))
BEGIN -- update
Insert DummyTrans VALUES ('Fill Log')
Delete DummyTrans
Select @Counter = @Counter + 1
EXEC (@TruncLog)
Select 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
Where name = @LogicalFileName
Drop TABLE DummyTrans
SET NOCOUNT OFF
更改某个表
exec sp_changeobjectowner 'tablename','dbo'
存储更改全部表
Create PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
if @Owner=@OldOwner
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
close curObject
deallocate curObject
循环写入数据
declare @i int
while @i&30
insert into test (userid) values(@i)
set @i=@i+1
新手上路我有疑问投诉建议参考资料 查看Oracle PL/SQL集合数据类型专题:
一、什么是PL/SQL集合数据类型
PL/SQL复合数据类型包括:PL/SQL记录、PL/SQL集合(分为PL/SQL表(别名索引表)、嵌套表、VARRAY)。
其中PL/SQL集合数据类型是指符合数据类型中的PL/SQL集合。
复合数据类型的说明在本博客的《PLSQL数据类型》中有详述,这里只对PL/SQL集合数据类型的一系列特有操作与应用做讲述。
二、PL/SQL集合的多级集合调用应用
说明:多级集合是指嵌套了集合类型的集合类型,从而实现多维数组功能,9i后支持。
1)多级PL/SQL表(索引表)
说明:如果多维数组元素个数没有限制,可以使用多级PL/SQL表和嵌套表。
Type al_table_type is table of int index by binary_ --定义一维table
Type nal_table_type is table of al_table_type index by binary_--定义二维table集合
Nv1 nal_table_
Nv1(1)(1):=10;&
Nv1(1)(2):=5; & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
Nv1(2)(1):=100;&
Nv1(2)(2):=50;
Dbms_output.put_line(‘显示二维数组所有元素’);
For I in 1..nv1.count loop
& For j in 1..nu1(i).count loop
& & Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
2)多级嵌套表
Type al_table_--定义一维嵌套表
Type nal_table_type is table of al_table_--定义二维嵌套表集合
Nv1 nal_table_typer :=nal_table_typer (al_table_type(2,4),al_table_type(5,73));
Dbms_output.put_line(‘显示二维数组所有元素’);
For I in 1..nv1.count loop
& For j in 1..nv1(i).count loop
& & Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
3)多级VARRAY
Type al_varray_type is varray(10)--定义一维varray
Type nal_varray_type is varray(10) of al_varray_--定义二维varray集合
nvl nal_varray_type:= nal_varray_type(
al_varray_type(58,100,102);
al_varray_type(55,6,73);
al_varray_type(2,4);
dbms_output.put_line(‘显示二维数组所有元素’);
for i in 1..nv1.count loop
& for j in 1..nv1.count loop
& & Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
三、集合数据类型的方法
说明:复合数据类型中PL/SQL集合类型所特有的集合方法,集合方法是Oracle所提供用于操纵集合变量的内置函数或过程。
方法包含EXISTS、COUNT、LIMIT、FIRST、NEXT、PRIOR和NEXT是函数,EXTEND、TRIM和DELETE是过程。
1、exists方法
说明:确定特定的PL/SQL表元素是否存在,如果集合元素存在,则返回true;如果不存在,则返回false
type ename_table_type is table of emp.ename%
ename_table ename_table_
if ename_table.exsts(1) then
ename_table(1):='scott';
dbms_output.put_line('必须初始化集合元素');
2、count方法
说明:返回当前集合变量中的元素总个数。
type aneme_table_type is table of emp.ename%type index by binary_
ename_table ename_table_
ename_table(-5):='aa';
ename_table(1):='b';
ename_table(10):='bk';
dbms_output.put_line(ename_table.count);
3、limit方法
说明:返回集合元素的最大元素个数。因为嵌套表和索引表的元素个数没有限制,所以调用方法会返回NULL;而对于VARRAY会返回最大元素个数。
type aneme_table_type is varray(20) of emp.ename%
ename_table ename_table_type:=ename_table_type('mary');
dbms_output.put_line(ename_table_type.limit);
4、first和last方法
说明:返回集合第一个、最后一个元素的下标。
type aneme_table_type is table of emp.ename%type index by binary_
ename_table ename_table_
ename_table(-5):='aa';
ename_table(1):='b';
ename_table(10):='bk';
dbms_output.put_line(ename_table.first);
dbms_output.put_line(ename_table.last);
5、prior和next方法
说明:返回当前集合元素的前一个元素和下一个元素
type ename_table_type is table of emp.ename%type index by benary_ --PL/SQL表
ett ename_table_
et(-5):='scott';
et(1):='smith';
st(5):='mary';
dbms_output.put_line('元素1的前一个元素值:' || et(et.prior(1))); --结果是scott
dbms_output.put_line('元素1的后一个元素值:' || et(et.next(1))); --结果是mary
6、extend方法
说明:为集合变量增加元素,只适用于嵌套表和VARRAY。
格式:extend 添加一个null元素
extend(n) 添加n个null元素
extend(n,i) 添加n个值与第i个元素相同的元素
type id_table_type is table of number(6); --嵌套表
idt id_table_type:=id_table_type(1,2,5); --声明并初始化3个元素
if idt.exists(4) then --判读第四个元素是否存在
dbms_output.put_line('元素值:' || idt(no));
dbms_output.put_line('元素未初始化'); --结果
idt.extend(999); --添加999个空元素
dbms_output.put_line('第一个元素是:' || idt(idt.first)); --结果为1
dbms_output.put_line('最后一个元素是:' || nvl(to_char(idt(idt.first)),'null')); --结果为null
dbms_output.put_line('元素总数为:' || idt.count); --结果为1002
7、trim方法
说明:从集合尾部删除元素,只适用于嵌套表和VARRAY。
格式:trim 删除一个元素
trim(n) 删除n个
type id_array_type is varray(30) of number(6); --可变长数组
iat id_array_type:=id_array_type('A','B','C','D','E','F','G','H','I','J','K','L');
dbms_output.put_line('元素总数为:' || iat.count); --结果为12
dbms_output.put_line('最大元素个数:' || iat.limit); --结果是30
iat.trim(5);
dbms_output.put_line('最后一个元素:' || iat(iat.last)); --结果是G
8、delete方法
说明:删除集合元素,只适用于嵌套表和索引表。
格式:delete 删除全部元素
delete(n) 删除第N个元素
delete(m,n) 删除除集合变量中m~n之间的所有元素
type id_table_type is table of number(6) index by binary_ --PL/SQL表
itt id_table_
for i in 1..10000 loop
itt(i):=i;
for j in 1..itt.count loop
if mod(j,2)=0 then
id.delete(j); --余数为0则删除该元素
四、集合数据类型的赋值。
当使用嵌套表和VARRAY时,通过执行insert、update、fetch、select,赋值语句,用可以将一个集合的数据赋值给另外一个集合。
从Oracle10g开始,给嵌套表赋值时,还可以用set、multiset union、multiset intersect、multiset except等集合操作符。
其中set用于取消嵌套表中的重复值,multiset union用于取得2个嵌套表的并集(带有distinct可以取消重复结果)
multiset intersect取得2个嵌套表的交集,multiset except取得2个嵌套表的差集。
1、将一个集合的数据赋值给另外一个集合
说明:当使用赋值语句(:=)或sql语句将源集合中的数据赋值给目标集合时,会自动清除模板集合原有数据再赋值。
注意:当进行集合赋值时,源集合和目标集合的数据类型必须一致。
type name_varray_type is varray(4) of varchar2(10);
name_array1 name_varray_
name_array2 name_varray_
name_array1:=name_varray_type('scott','smith');
name_array2:=name_varray_type('a','a','a','a','a');
dbms_output.put('2的原数据:');
for i in 1..name_array2.count loop
dbms_output.put(name_array2(i));
dbms_output.new_
name_array2:=name_array1;
dbms_output.put('2的新数据:');
for i in 1..name_array2.count loop
dbms_output.put(name_array2(i));
dbms_output.new_
2、给集合符NULL值
说明:在清空集合变量的所有数据时,既可以使用集合delete和trim,也可以讲一个null集合变量赋给目标集合变量。
type name_varray_type is varray(4) of varchar2(10);
name_array1 name_varray_
name_array2 name_varray_
name_array1:=name_varray_type('scott','smith');
dbms_output.put('2的原数据个数'||name_array1.count);
name_array1:=name_array2;
dbms_output.put('2的新数据个数'||name_array1.count);
3、使用集合操作符给嵌套表赋值
说明:10g开始,允许将多个嵌套表的结果组合到某个嵌套表中,通过使用ANSI集合操作符(set,multiset union,
multiset intersect,multiset except)实现。
1)、set操作符
说明:用于去掉嵌套表中的重复值。
type nt_table_typ
nt_table nt_table_type:=nt_table_type(2,4,3,1,2);
result nt_table_
result:=set(nt_table);
dbms_output.put('result:');
for i in 1..result.count loop
dbms_output.put(' '||result(1));
dbms_output.new_
2)、multiset union和multiset union distinct操作符
说明:multiset union取得2个嵌套表的并集,保留重复项;multiset union distinct去掉重复。
type nt_table_type
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_
result:=nt1 multiset union nt2;
dbms_output.put('resilt:');
for i in 1..result.count loop
dbms_output.put(' '||result(i));
dbms_output.new_
3)、multiset intersect操作符
说明:取得2个嵌套表的交集。
type nt_table_type
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_
result:=nt1 multiset intersect nt2;
dbms_output.put('resilt:');
for i in 1..result.count loop
dbms_output.put(' '||result(i));
dbms_output.new_
4)、multiset except操作符
说明:取两个嵌套表变量的差集。
type nt_table_type
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(3,4,5);
result nt_table_
result:=nt1 multiset except nt2;
dbms_output.put('resilt:');
for i in 1..result.count loop
dbms_output.put(' '||result(i));
dbms_output.new_
五、集合数据类型的比较
说明:用于比较两个集合变量是否相同。
10g后新增集合比较操作符包括:
CARDINALITY(返回嵌套表变量的元素个数),
SUBMULTISET OF(确定一个嵌套表是否为领一个嵌套表的子集),
MEMBER OF(检测特定数据是否为嵌套表元素),
IS A SET(检测嵌套表是否包含重复的元素),
IS EMPTY(检测嵌套表是否为null)等。
1、检测集合是否为null
说明:is null使用于嵌套表或VARRAY变量;is empty只使用于嵌套表。
type name_array_type is varray(3) of varchar2(10);
name_array nane_array_
--if name_array is empty then
if name_array is null then
dbms_output.put_line('未初始化');
2、比较嵌套表是否相同
说明:使用=和!=比较嵌套表是否相同,只能用于嵌套表。
type name_table_type is table of varchar2(10);
name_table1 name_table_
name_table2 name_table_
name_table1:=name_table_type('scott');
name_table2:=name_table_tyoe('smith');
if name_table1=name_table2 then
dbms_output.put_line('相同');
dbms_output.put_line('不同');
3、在嵌套表上使用ANSI集合操作符
说明:这些操作符只适用于嵌套表。
1)、CARDINALITY
说明:也可以称为函数,返回嵌套表变量的元素个数。
type nt_table_typ
nt1 nt_table_tyoe:=nt_table_type(1,2,3,1);
dbms_output.put_line('元素个数'||CARDINALITY(nt1));
2)、SUBMULTISET OF
说明:用于确定一个嵌套表是否为另一个嵌套表的子集。
type nt_table_typ
nt1 nt_table_type:=nt_table_type(1,2,3);
nt2 nt_table_type:=nt_table_type(1,2,3);
if nt1 submiltiset of nt2 then
dbms_output.put_line('nt1是nt2的子集');
3)、MEMBER OF
说明:检测特定数据是否为嵌套表的元素。
type nt_table_typ
nt1 nt_table_tyoe:=nt_table_tyoe(1,2,3,5);
v1 number:=2;
if v1 member of nt1 then
dbms_output.put_line('v1是nt1的元素');
4)、IS A SET
说明:用于检测嵌套表是否包含重复的元素值。
type nt_table_typ\
ot1 nt_table_type:=nt_table_type(1,2,3,5);
if nt1 is a set then
dbms_output.put_line('嵌套表nt1无重复值');
六、集合数据类型的批量绑定
说明:9i新增,是指执行单次SQL操作能传递所有集合的数据,当在select、insert、update、delete
语句上处理批量数据时,通过批量绑定,可以极大加快数据处理速度。
批量绑定用bult collect子句和forall语句完成,其中bult collect子句用于取得批量数据,
该子句只能用于select语句、fetch语句、dml返回子句中;而forall语句值适用于执行批量DML操作。
1、使用与不使用批量绑定的区别
1)、不适用批量绑定
说明:9i之前,为了将多个集合元素插入到数据库表,必须要使用循环完成。
例子:以索引表为例
type id_table_type id table of number(6) index by binary_
type name_table_type is table of varchar2(10) index by binary_
id_table id_table_
name_table name_table_
start_time number(10);
end_time number(10);
for i in 1..5000 loop
id_table(i):=i;
name_table(i):='Name'||to_char(i);
start_time:=dbms_utility.get_
for i in 1..id_table.count loop
insert into demo values(id_table(i),name_table(i));
end_time:=dbms_utility.get_
dbms_output.put_line('总时间'||to_char((end_time-start_time)/100));
2)、使用批量绑定
type id_table_type id table of number(6) index by binary_
type name_table_type is table of varchar2(10) index by binary_
id_table id_table_
name_table name_table_
start_time number(10);
end_time number(10);
for i in 1..5000 loop
id_table(i):=i;
name_table(i):='Name'||to_char(i);
start_time:=dbms_utility.get_
--批量绑定的使用开始
forall i in 1..id_table.count
insert into demo values(id_table(i),name_table(i));
--批量绑定的使用结束
end_time:=dbms_utility.get_
dbms_output.put_line('总时间'||to_char((end_time-start_time)/100));
2、FORALL语句
说明:当要在PL/SQL中执行批量insert、update、delete操作,可以使用forall语句。
9i前forall语句必须是连续的元素;10g后通过增加indices of子句和values of子句,可以使用不连续的集合元素。
注意:for语句时循环语句,forall不是循环语句。如下面语法,9i只有语法一,10g后新增了语法二、三。
语法一:forall i in lower_bound..upper_bound sql_
其中,i是隐含定义的整数变量(将作为集合元素下标被引用),lower_bound和upper_bound是集合元素上下界。
语法二:forall i in indices of collection [between lower_bound and upper_bound] sql_
其中,indices of指定只取对应于collection集合元素下标的i值。
语法三:forall i in values of index_collection sql_
其中,values of指定i值从集合变量index_collection中取得。
1)、DML语句上使用批量绑定
说明:使用批量绑定为数据库表插入数据时,首先需要给集合元素赋值,然后使用forall语句执行批量绑定插入操作。
type id_table_type id table of number(6) index by binary_
type name_table_type is table of varchar2(10) index by binary_
id_table id_table_
name_table name_table_
for i in 1..50 loop
id_table(i):=i;
name_table(i):='Name'||to_char(i);
forall i in 1..id_table.count
insert into demo values(id_table(i),name_table(i));
update demo set name=name_table(i) where id=id_table(i);
delete from demo where id=id_table(i);
2)、FORALL语句中使用部分集合连续的元素
说明:上面说到的都是集合的所有元素,forall可以使用部分元素。
type id_table_type id table of number(6) index by binary_
id_table id_table_
for i in 1..50 loop
id_table(i):=i;
forall i in 8..10
insert into demo values(id_table(i),name_table(i));
3)、forall语句上使用indices of子句
说明:indices of子句是10g新增,用于跳过集合中的null元素。
type id_table_tyoe is table of number(6);
id_table id_table_
id_table:=id_table_type(1,null,3,null,5);
forall i in indicrs of id_table
delete from demo where id=id_table(i);
4)、forall语句上使用values of子句
说明:values of子句是10g新增,用于从其他集合中取得集合下标的值。
type id_table_type is table of demo.id%
type name_table_type is table of demo.name%
id_table id_table_
name_table name_table_
type index_pointer_type is table of pls_
index_pointer index_pointer_
select * bulk collect into id_table,name_
index_pointer:=index_pointer_type(6,8,10);
forall i in values of index_pointer
insert into new_demo_table2 values(id_table(i),name_table(i));
--结果是向表中插入了6 8 10的数据
5)、forall语句上使用SQL%BULK_ROWCOUNT属性
说明:专门为forall语句提供的属性,用于取得执行批量绑定是第i个元素所作用的行数。
type dno_table_type is table of number(3);
dno_table dno_table_type:=dno_table_type(10,20);
forall i in 1..dno_table.count
update emp set sal=sal*1.1 where deptno=dno_table(i);
dbms_output.put_line('第2个元素更新的行数:'||SQL%BULK_ROWCOUNT(2));
3、BULK COLLECT子句
说明:用于取得批量数据,将批量数据存放到PL/SQL集合变量中,只用于select into、fetch into和dml返回子句中。
语法:。。。BULK COLLECT into collection_name[,collection_name]。。。
其中,collection_name指定存放的集合变量名
1)、在select into语句中使用bulk collect
说明:9i前,select into必须且只能返回1行数据,否者抛异常,9i开始通过在elect into使用bulk collect子句可以
一次将select语句的多行结果检索到集合变量。
type emp_table_type is table of emp%rowtype index by binary_
emp_table emp_table_
select * bulk collect into emp_table from emp where deptno=&
for i in 1..emp_table.count loop
dnms_output.put_line('emp_table(i).ename');
2)、在DML的返回子句中使用bulk collect子句
说明:为了取得DML操作所改变的数据,可以使用returning子句;为了取得DML所作用的多行数据,需要使用bulk collect子句。
type ename_table_type is table of emp.ename%
ename_table ename_table_
delete from emp where deptnp=&no returning ename bulk collect into ename_
dbms_output.put('雇员名:');
for i in 1..ename_table.count loop
dbms_output.put(ename_table(i));
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:54560次
排名:千里之外
原创:47篇
(1)(1)(1)(5)(1)(2)(2)(2)(4)(26)(3)(2)

我要回帖

更多关于 sql except用法 的文章

 

随机推荐