导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

SQL SERVER SELECT一系列 SQL语句,怎么通过语义分析等等 自动变为有效的ORACLE SELECT 语句?

zhaotianyi2004 2007-12-02 09:02:33
小弟在写个小论文,其中涉及“SQL SERVER SELECT一系列 SQL语句,怎么通过语义分析等等 自动变为有效的ORACLE SELECT 语句?”包括外连接,以及一些常用的函数,有没有比较成型的解决方案,给的网址也行,谢谢大家了,并以重分相写。
...全文
174 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fa_ge 2007-12-04
数字/数学函数
下面是 Oracle 支持的数字/数学函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
绝对值 ABS ABS
反余弦 ACOS ACOS
反正弦 ASIN ASIN
n 的反正切 ATAN ATAN
m/n 的反正切 ATAN2 ATN2
>=值的最小整数 CEIL CEILING
余弦 COS COS
双曲余弦 COSH COT
指数值 EXP EXP
<=值的最大整数 FLOOR FLOOR
自然对数 LN LOG
以任何为底的对数 LOG(N) 暂缺
以 10 为底的对数 LOG(10) LOG10
模数(余数) MOD USE MODULO (%) OPERATOR
幂 POWER POWER
随机数 暂缺 RAND
舍入 ROUND ROUND
数的符号 SIGN SIGN
正弦 SIN SIN
双曲正弦 SINH 暂缺
平方根 SQRT SQRT
正切 TAN TAN
双曲正切 TANH 暂缺
截尾 TRUNC 暂缺
列表中的最大数 GREATEST 暂缺
列表中的最小数 LEAST 暂缺
如果为 NULL,转换成数字 NVL ISNULL
字符函数
下面是 Oracle 支持的字符函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
把字符转换成 ASCII ASCII ASCII
字符串串联 CONCAT (表达式 + 表达式)
把 ASCII 转换成字符 CHR CHAR
返回字符串中的起始字符(从左) INSTR CHARINDEX
将字符转换成小写 LOWER LOWER
将字符转换成大写 UPPER UPPER
在字符串的左边填充字符 LPAD 暂缺
删除前导空格 LTRIM LTRIM
删除尾空格 RTRIM RTRIM
字符串中模式的起始点 INSTR PATINDEX
多次重复字符串 RPAD REPLICATE
字符串的语音表示 SOUNDEX SOUNDEX
重复空格的字符串 RPAD SPACE
从数字数据转换而来的字符数据 TO_CHAR STR
子串 SUBSTR SUBSTRING
字符替换 REPLACE STUFF
字符串中每个词的第一个字母大写 INITCAP 暂缺
字符串转换 TRANSLATE 暂缺
字符串长度 LENGTH DATELENGTH 或 LEN
列表中的最大字符串 GREATEST 暂缺
列表中的最小字符串 LEAST 暂缺
如果为 NULL,则转换字符串 NVL ISNULL
日期函数
下面是 Oracle 支持的日期函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
日期加 (日期列 +/- 值)或 ADD_MONTHS DATEADD
日期间的间隔 (日期列 +/- 值)或 MONTHS_BETWEEN DATEDIFF
当前日期和时间 SYSDATE GETDATE()
月的最后一天 LAST_DAY 暂缺
时区转换 NEW_TIME 暂缺
该日期后的第一个工作日 NEXT_DAY 暂缺
日期的字符串表示 TO_CHAR DATENAME
日期的整数表示 TO_NUMBER (TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截尾 TRUNC CONVERT
字符串转换为日期 TO_DATE CONVERT
如果为 NULL,则转换日期 NVL ISNULL
转换函数
下面是 Oracle 支持的转换函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
数字到字符 TO_CHAR CONVERT
字符到数字 TO_NUMBER CONVERT
日期到字符 TO_CHAR CONVERT
字符到日期 TO_DATE CONVERT
十六进制到二进制 HEX_TO_RAW CONVERT
二进制到十六进制 RAW_TO_HEX CONVERT
其它行级函数
下面是 Oracle 支持的其它行级函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
返回第一个非空表达式 DECODE COALESCE
当前序列值 CURRVAL 暂缺
下一个序列值 NEXTVAL 暂缺
如果表达式 1 = 表达式 2,则返回空 DECODE NULLIF
用户的登录 ID 号 UID SUSER_ID
用户的登录名 USER SUSER_NAME
用户的数据库 ID 号 UID USER_ID
用户的数据库名 USER USER_NAME
当前用户 CURRENT_USER CURRENT_USER
用户环境(审核记录) USERENV 暂缺
CONNECT BY 子句的级别 LEVEL 暂缺
合计函数
下面是 Oracle 支持的合计函数及其 Microsoft SQL Server 对等函数。
函数 Oracle Microsoft SQL Server
平均值 AVG AVG
计数 COUNT COUNT
最大值 MAX MAX
最小值 MIN MIN
标准偏差 STDDEV STDEV 或 STDEVP
汇总 SUM SUM
方差 VARIANCE VAR 或 VARP

条件测试
Oracle DECODE 语句和 Microsoft SQL Server CASE 表达式都执行条件测试。当 test_value 中的值符合下列任何表达式时,就会返回相关的值。如果不符合,则返回 default_value。如果没有指定 default_value,且不符合任何表达式,则 DECODE 和 CASE 返回 NULL。下表给出了语法以及一个转换的 DECODE 命令的示例。
Oracle Microsoft SQL Server
DECODE (test_value,
expression1, value1
[[,expression2, value2] [U]]
[,default_value]
)

CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(DECODE(grade
,'A', 4
,'A+', 4.3
,'A-', 3.7
,'B', 3
,'B+', 3.3
,'B-', 2.7
,'C', 2
,'C+', 2.3
,'C-', 1.7
,'D', 1
,'D+', 1.3
,'D-', 0.7
,0)),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN CASE input_expression
WHEN when_expression THEN result_expression
[[WHEN when_expression THEN result_expression] [...]]
[ELSE else_result_expression]
END

CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(CASE grade
WHEN 'A' THEN 4
WHEN 'A+' THEN 4.3
WHEN 'A-' THEN 3.7
WHEN 'B' THEN 3
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
END),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN
CASE 表达式可以支持使用 SELECT 语句进行布尔测试,这是 DECODE 命令所不允许的。有关 CASE 表达式的详细信息,请参见 SQL Server Books Online。
将值转换为不同的数据类型
Microsoft SQL Server CONVERT 和 CAST 函数均是多用途的转换函数。它们提供了相似的功能,把一种数据类型的表达式转换为另一种数据类型,并支持多种特殊的数据格式:
• CAST(expression AS data_type)
• CONVERT (data type[(length)], expression [, style])
CAST 是一个 SQL-92 标准函数。这些函数执行与 Oracle TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW 和 RAWTOHEX 函数相同的操作。
数据类型是指该表达式要转换成为的任何系统数据类型。不能使用用户定义的数据类型。length 参数是可选的,它与 char、varchar、binary 和 varbinary 数据类型一起使用。可允许的最大长度是 8000。
转换 Oracle Microsoft SQL Server
字符到数字 TO_NUMBER('10') CONVERT(numeric, '10')
数字到字符 TO_CHAR(10) CONVERT(char, 10)
字符到日期 TO_DATE('04-JUL-97')
TO_DATE('04-JUL-1997',
'dd-mon-yyyy')
TO_DATE('July 4, 1997',
'Month dd, yyyy') CONVERT(datetime, '04-JUL-97')
CONVERT(datetime, '04-JUL-1997')
CONVERT(datetime, 'July 4, 1997')
日期到字符 TO_CHAR(sysdate)
TO_CHAR(sysdate, 'dd mon yyyy')
TO_CHAR(sysdate, 'mm/dd/yyyy') CONVERT(char, GETDATE())
CONVERT(char, GETDATE(), 106)
CONVERT(char, GETDATE(), 101)
十六进制到二进制 HEXTORAW('1F') CONVERT(binary, '1F')
二进制到十六进制 RAWTOHEX
(binary_column) CONVERT(char, binary_column)
注意,字符串是如何转换成日期的。在 Oracle 中,默认的日期格式模型为“DD-MON-YY”。如果使用任何其它格式,必须提供相应的日期格式模型。CONVERT 函数自动转换标准日期格式,而无须格式模型。
当把日期转换成字符串时,CONVERT 函数默认输出为“dd mon yyyy hh:mm:ss:mmm(24h)”。一种数字类型的编码用于设定到其它日期格式模型输出的格式。有关 CONVERT 函数的详细信息,请参见 SQL Server Books Online。
下表给出了 Microsoft SQL Server 日期的默认输出。
不带世纪 带有世纪 标准 输出
- 0 或 100 (*) 默认 mon dd yyyy hh:miAM(或 PM)
1 101 美国 mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认毫秒 mon dd yyyy hh:mi:ss:mmm(AM 或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)

回复
fa_ge 2007-12-04
我贴一些它们有什么异同



SELECT 语句
Oracle 和 Microsoft SQL Server 使用的 SELECT 语句语法类似。
Oracle Microsoft SQL Server
SELECT [/*+ optimizer_hints*/]
[ALL | DISTINCT] select_list
[FROM
{table_name | view_name | select_statement}]
[WHERE clause]
[GROUP BY group_by_expression]
[HAVING search_condition]
[START WITH U CONNECT BY]
[{UNION | UNION ALL | INTERSECT |
MINUS} SELECT U]
[ORDER BY clause]
[FOR UPDATE] SELECT select_list
[INTO new_table_]
FROM table_source
[WHERE search_condition]
[ GROUP BY [ALL] group_by_expression [,Un]
[ WITH { CUBE | ROLLUP } ]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC] ]
In addition:
UNION Operator
COMPUTE Clause
FOR BROWSE Clause
OPTION Clause
SQL Server 不支持 Oracle 特定的基于开销的优化程序提示,它必须被删除。建议使用的技术是,使用 SQL Server 基于开销的优化程序。有关详细信息,请参见本章后面的“SQL 语句优化”。
SQL Server 不支持 Oracle 的 START WITHUCONNECT BY 子句。在 SQL Server 中,可以创建完成相同任务的存储过程替代它。
SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合运算符。可使用 SQL Server EXISTS 和 NOT EXISTS 子句,实现相同的结果。
在下面示例中,使用 INTERSECT 运算符,用于查找学生登记的所有课程的代码和名称。注意,EXISTS 运算符是如何代替 INTERSECT 运算符的。返回的数据是相同的。
Oracle Microsoft SQL Server
SELECT CCODE, CNAME
FROM DEPT_ADMIN.CLASS
INTERSECT
SELECT C.CCODE, C.CNAME
FROM STUDENT_ADMIN.GRADE G,
DEPT_ADMIN.CLASS C
WHERE C.CCODE = G.CCODE SELECT CCODE, CNAME
FROM DEPT_ADMIN.CLASS C
WHERE EXISTS
(SELECT 'X' FROM STUDENT_ADMIN.GRADE G
WHERE C.CCODE = G.CCODE)
在此例中,使用 MINUS 运算符,查找那些没有任何学生登记的课程。
Oracle Microsoft SQL Server
SELECT CCODE, CNAME
FROM DEPT_ADMIN.CLASS
MINUS
SELECT C.CCODE, C.CNAME
FROM STUDENT_ADMIN.GRADE G,
DEPT_ADMIN.CLASS C
WHERE C.CCODE = G.CCODE SELECT CCODE, CNAME
FROM DEPT_ADMIN.CLASSC
WHERE NOT EXISTS
(SELECT 'X' FROM STUDENT_ADMIN.GRADE G
WHERE C.CCODE = G.CCODE)
INSERT 语句
Oracle 和 Microsoft SQL Server 使用的 INSERT 语句语法类似。
Oracle Microsoft SQL Server
INSERT INTO
{table_name | view_name | select_statement} [(column_list)]
{values_list | select_statement} INSERT [INTO]
{
table_name [ [AS] table_alias] WITH ( <table_hint_limited> [Un])
| view_name [ [AS] table_alias]
| rowset_function_limited
}

{ [(column_list)]
{ VALUES ( { DEFAULT
| NULL
| expression
}[,Un]
)
| derived_table
| execute_statement
}
}
| DEFAULT VALUES
Transact-SQL 语言支持对表和视图的插入,但不支持对 SELECT 语句的 INSERT 操作。如果 Oracle 应用程序代码执行对 SELECT 语句的插入操作,则必须对它进行修改。
Oracle Microsoft SQL Server
INSERT INTO (SELECT SSN, CCODE, GRADE FROM GRADE)
VALUES ('111111111', '1111',NULL) INSERT INTO GRADE (SSN, CCODE, GRADE)
VALUES ('111111111', '1111',NULL)
Transact-SQL values_list 参数提供了 SQL-92 标准关键字 DEFAULT,但 Oracle 不支持。此关键字指定了,执行插入操作时使用列的默认值。如果指定列的默认值不存在,则插入 NULL。如果该列不允许 NULL,则返回一个错误消息。如果该列数据类型定义为 timestamp,则插入下一个有序值。
标识符列不能使用 DEFAULT 关键字。要生成下一个序列号,拥有 IDENTITY 属性的列不能列在 column_list 或 values_clause 中。不需使用 DEFAULT 关键字,来获取列的默认值。正如在 Oracle 中,如果列没有在 column_list 中引用,并且它有默认值,则默认值存放在列中。这是迁移时可使用的最兼容的方法。
一个有用的 Transact_SQL 选项 (EXECute procedure_name) 是,执行一个过程并将其结果用管道输出到目标表或视图中。Oracle 不允许这样做。
UPDATE 语句
因为 Transact SQL 支持 Oracle UPDATE 命令使用的绝大多数语法,所以只需要极少的修改。
Oracle Microsoft SQL Server
UPDATE
{table_name | view_name | select_statement}
SET [column_name(s) = {constant_value | expression | select_statement | column_list |
variable_list]
{where_statement} UPDATE
{
table_name [ [AS] table_alias] WITH ( <table_hint_limited> [Un])
view_name [ [AS] table_alias]
| rowset_function_limited
}
SET
{column_name = {expression | DEFAULT | NULL}
| @variable = expression
| @variable = column = expression } [,Un]

{{[FROM {<table_source>} [,Un] ]

[WHERE
<search_condition>] }
|
[WHERE CURRENT OF
{ { [GLOBAL] cursor_name } | cursor_variable_name}
] }
[OPTION (<query_hint> [,Un] )]
Transact-SQL UPDATE 语句不支持对 SELECT 语句的更新操作。如果 Oracle 应用程序代码对 SELECT 语句进行更新,则可以把 SELECT 语句转换成一个视图,然后在 SQL Server UPDATE 语句中使用该视图名称。请参见前面“INSERT 语句”中的示例。
Oracle UPDATE 命令只能使用一个 PL/SQL 块中的程序变量。要使用变量,Transact-SQL 语言并不需要使用块。
Oracle Microsoft SQL Server
DECLARE
VAR1 NUMBER(10,2);
BEGIN
VAR1 := 2500;
UPDATE STUDENT_ADMIN.STUDENT
SET TUITION_TOTAL = VAR1;
END; DECLARE
@VAR1 NUMERIC(10,2)
SELECT @VAR1 = 2500
UPDATE STUDENT_ADMIN.STUDENT
SET TUITION_TOTAL=@VAR1
在 SQL Server 中,DEFAULT 关键字可用于将一列设为其默认值。但不能使用 Oracle UPDATE 命令,将一列设为默认值。
Transact-SQL 和 Oracle SQL 均支持在 UPDATE 语句中使用子查询。但是,Transact-SQL FROM 子句可用来创建一个基于联接的 UPDATE。这一功能使 UPDATE 语法可读性更好,在某些情况下还能改善性能。
Oracle Microsoft SQL Server
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
WHERE SSN IN (SELECT SSN
FROM GRADE G
WHERE G.SSN = S.SSN
AND G.CCODE = '1234') Subquery:
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
WHERE SSN IN (SELECT SSN
FROM GRADE G
WHERE G.SSN = S.SSN
AND G.CCODE = '1234')
FROM clause:
UPDATE
STUDENT_ADMIN.STUDENT S
SET TUITION_TOTAL = 1500
FROM GRADE G
WHERE S.SSN = G.SSN
AND G.CCODE = '1234'
DELETE 语句
在大多数情况下,不需要修改 DELETE 语句。如果要对 Oracle 中的 SELECT 语句执行删除操作,则必须修改 SQL Server 语法,因为 Transact-SQL 不支持这一功能。
Transact-SQL 支持在 WHERE 子句中使用子查询,以及在 FROM 子句中使用联接。后者可产生更有效的语句。请参见前面“UPDATE 语句”中的示例。
Oracle Microsoft SQL Server
DELETE [FROM]
{table_name | view_name | select_statement}
[WHERE clause] DELETE
[FROM ]
{
table_name [ [AS] table_alias] WITH ( <table_hint_limited> [Un])
| view_name [ [AS] table_alias]
| rowset_function_limited
}

[ FROM {<table_source>} [,Un] ]
[WHERE
{ <search_condition>
| { [ CURRENT OF
{
{ [ GLOBAL ] cursor_name }
cursor_variable_name
}
]
}
]
[OPTION (<query_hint> [,Un])]
TRUNCATE TABLE 语句
Oracle 和 Microsoft SQL Server 使用的 TRUNCATE TABLE 语句语法类似。TRUNCATE TABLE 用于从表中删除所有的行,并且不能回滚。表结构及其所有索引继续存在。DELETE 触发器不执行。如果表被一个 FOREIGN KEY 约束引用,则它不能被截断。
Oracle Microsoft SQL Server
TRUNCATE TABLE table_name
[{DROP | REUSE} STORAGE] TRUNCATE TABLE table_name
在 SQL Server 中,此语句只能由表的所有者执行。在 Oracle 中,如果是表的所有者或拥有 DELETE TABLE 系统权限,就可以执行此命令。
Oracle TRUNCATE TABLE 命令可以有选择地释放表中行所占用的存储空间。SQL Server TRUNCATE TABLE 语句总是收回表数据及其相关索引所占用的空间。
标识符列和时间戳列中数据的处理
Oracle 序列是与任何给定的表或列均不直接相关的数据库对象。列和序列之间的关系是在应用程序中实现的,即通过编程的方法将序列值赋给列。因此,Oracle 使用序列时,并不实施任何规则。但是,在 Microsoft SQL Server 标识符列中,值不能被更新,并且不能使用 DEFAULT 关键字。
默认情况下,数据不能直接插入到标识符列。标识符列自动给表中插入的每个新行生成一个唯一的序列号。可以使用下列 SET 语句改写这种默认设置:
SET IDENTITY_INSERT table_name ON
将 IDENTUTY_INSERT 设为 ON,用户就可以向新行的标识符列插入任何值。要防止出现有重复号码的条目,必须为该列创建唯一索引。这条语句的目的是,允许用户给无意中删除的行重新创建一个值。@@IDENTITY 函数可用来获取上一个标识值。
回复
fa_ge 2007-12-04
我会点oracle ,但我觉得oracle 和mssql 有太大的不同了
我想是没有办法让mssql 自动 转化为 oracle 的,只有我们人为的修改
回复
fa_ge 2007-12-04
呵呵
回复
dawugui 2007-12-04
我认为立项的这个人可以辞职了.
回复
ZHAOZY 2007-12-03
语法分析 语义分析 包括函数的替换 网上有一些 你可以看看
http://www.zzju.net/oracle/41971.html
回复
sn_wolf 2007-12-03
把不同的数据库写到一个enum枚举类型
然后通过switch(database)
case 你的数据库类型
完成相应的操作就可以
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告