oracale select column into var from .....sql var = select column from ...
数字转换Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型,同时采用可选的数字格式。SQL Server则通过STR函数返回数字转换之后的字符数据。不过,该函数不具方便的Format参数。Oracle查询如下: SELECT to_char(123.45 ,99999999999999) from tab SELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab以下是SQL Server版本的查询: SELECT STR(123.45, 14) SELECT STR(round(123.455 , 2),12,2) SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),' ' , '') as varchar(9)) LENGTH和LEN以下是Oracle的查询: SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL;以上查询在SQL Server下是这样写的: SELECT LEN('SQLMAG') "Length in characters" 日期以上两种系统都具有各自的当前日期和时间格式。Oracle取得日期和采用如下方式: SYSDATESQL Server则是这样的: GETDATE()你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月): Select add_months(sysdate,12) from dualSQL Server则是如下完成同等功能的: Select dateadd(mm,12,getdate())数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作: SELECT sysdate -add_months(sysdate,12) FROM dualSQL Server则是这样做的: SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate()))
外连接 •MS SQL SERVER 支持两种形式表间连接 ①从Sybase继承来的形式: 字段1 *= 字段2 (左连接) 字段1 =* 字段2 (右连接) 没有这种形式的全外连接语法 ②标准的外连接语法 left [outer] join on 逻辑表达式 right [outer] join on 逻辑表达式 full [outer] join (全外连接) on 逻辑表达式 这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误 Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables 这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的 例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO from dbo.VU_CAF_BILLS A,TU_Flag where A.CAF_NO*=TU_Flag.ObjNo 视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 •Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷 字段1 = 字段2(+) (左连接) 字段1(+) = 字段2 (右连接) •使用外连接语句的用处 ①不想因为表连接而使主表数据行丢失,这一点毋庸多说 ①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法, 使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句 而使用下面的语法: select TU_COMPANY.* from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode where TU_Comp_Agent.Id is null 、表数据复制 •库内数据复制 •MS SQL Server Insert into 复制表名称 select 语句 (复制表已经存在) select 字段列表 into 复制表名称 from 表 (复制表不存在) •Oracle Insert into 复制表名称 select 语句 (复制表已经存在) create table 复制表名称 as select 语句 (复制表不存在)
•文本文件转入、转出的批量处理 •MS SQL Server BCP命令行程序 •Oracle SQLLDR命令行程序
多表更新、删除 一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表 一般形式: •MS SQL Server update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式 •Oracle update A SET 字段1=(select 字段表达式 from B WHERE ...), 字段2=(select 字段表达式 from B WHERE ...) WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练 动态执行SQL语句 •MS SQL SERVER 7.0好象没有这个功能,MS SQL SERVER 2000已经这个功能。 你是不是想在存储过程的参数中传递一个表名或者在过程体里动态 生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了 declare @count int declare @SQL nvarchar(200) set @SQL = N'select count(*) from sysobjects' exec sp_executesql @SQL,N'@i int output',@count output
SELECT to_char(123.45 ,99999999999999) from tab
SELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab以下是SQL Server版本的查询:
SELECT STR(123.45, 14)
SELECT STR(round(123.455 , 2),12,2)
SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),' ' , '') as varchar(9))
LENGTH和LEN以下是Oracle的查询:
SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL;以上查询在SQL Server下是这样写的:
SELECT LEN('SQLMAG') "Length in characters"
日期以上两种系统都具有各自的当前日期和时间格式。Oracle取得日期和采用如下方式:
SYSDATESQL Server则是这样的:
GETDATE()你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月):
Select add_months(sysdate,12) from dualSQL Server则是如下完成同等功能的:
Select dateadd(mm,12,getdate())数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作:
SELECT sysdate -add_months(sysdate,12) FROM dualSQL Server则是这样做的:
SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate()))
•MS SQL SERVER 支持两种形式表间连接
①从Sybase继承来的形式:
字段1 *= 字段2 (左连接)
字段1 =* 字段2 (右连接)
没有这种形式的全外连接语法
②标准的外连接语法
left [outer] join on 逻辑表达式
right [outer] join on 逻辑表达式
full [outer] join (全外连接) on 逻辑表达式
这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误
Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的
例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
from dbo.VU_CAF_BILLS A,TU_Flag
where A.CAF_NO*=TU_Flag.ObjNo
视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 •Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷
字段1 = 字段2(+) (左连接)
字段1(+) = 字段2 (右连接) •使用外连接语句的用处
①不想因为表连接而使主表数据行丢失,这一点毋庸多说
①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法,
使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句
而使用下面的语法:
select TU_COMPANY.*
from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
where TU_Comp_Agent.Id is null
、表数据复制
•库内数据复制
•MS SQL Server
Insert into 复制表名称 select 语句 (复制表已经存在)
select 字段列表 into 复制表名称 from 表 (复制表不存在)
•Oracle
Insert into 复制表名称 select 语句 (复制表已经存在)
create table 复制表名称 as select 语句 (复制表不存在)
•文本文件转入、转出的批量处理
•MS SQL Server
BCP命令行程序
•Oracle
SQLLDR命令行程序
一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表
一般形式:
•MS SQL Server
update A
SET 字段1=B表字段表达式,
字段2=B表字段表达式
from B
WHERE 逻辑表达式
•Oracle
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练
动态执行SQL语句
•MS SQL SERVER 7.0好象没有这个功能,MS SQL SERVER 2000已经这个功能。
你是不是想在存储过程的参数中传递一个表名或者在过程体里动态
生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
•Oracle提供了两种方法实现这个功能
①程序包DBMS_SQL,执行一个语句的过程:
打开游标(open_cursor,对于非查询语句,无此过程)
分析语句(Parse)
绑定变量(bind_variable)
执行语句(execute)
关闭游标(close_cursor,对于非查询语句,无此过程)
②execute immediate ls_SQL
iif(exp , value,value)ora:
decode(exp , value,exp , value)