小弟在写个小论文,其中涉及“SQL SERVER SELECT一系列 SQL语句,怎么通过语义分析等等 自动变为有效的ORACLE SELECT 语句?”包括外连接,以及一些常用的函数,有没有比较成型的解决方案,给的网址也行,谢谢大家了,并以重分相写。

解决方案 »

  1.   

    把不同的数据库写到一个enum枚举类型
    然后通过switch(database)
    case 你的数据库类型 
    完成相应的操作就可以
      

  2.   

    语法分析 语义分析 包括函数的替换 网上有一些 你可以看看
    http://www.zzju.net/oracle/41971.html
      

  3.   

    我会点oracle ,但我觉得oracle 和mssql 有太大的不同了
    我想是没有办法让mssql 自动 转化为 oracle 的,只有我们人为的修改
      

  4.   

    我贴一些它们有什么异同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 函数可用来获取上一个标识值。 
      

  5.   

    数字/数学函数
    下面是 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]
    ENDCREATE 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)