没有合适的资源?快使用搜索试试~ 我知道了~
首页oracle和SQL的语法区别
oracle和SQL的语法区别
需积分: 10 115 浏览量
更新于2023-05-26
评论
收藏 315KB DOC 举报
1. 验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何必要的修改。 2. 把所有外部联接改为 SQL-92 标准外部联接语法。 3. 用相应 SQL Server 函数替代 Oracle 函数。 4. 检查所有的比较运算符。 5. 用“+”字符串串联运算符代替“||”字符串串联运算符。 6. 用 Transact-SQL 程序代替 PL/SQL 程序。 7. 把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。 8. 用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。 9. 把 PL/SQL 触发器转换为 Transact-SQL 触发器。 10. 使用 SET SHOWPLAN 语句,优化查询性能。
资源详情
资源评论
资源推荐

SQL 语言支持
这一部分概述了 Transact-SQL 和 PL/SQL 语言语法之间的相同点和不同点,并给出转换策略。
要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行:
1. 验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何
必要的修改。
2. 把所有外部联接改为 SQL-92 标准外部联接语法。
3. 用相应 SQL Server 函数替代 Oracle 函数。
4. 检查所有的比较运算符。
5. 用“+”字符串串联运算符代替“||”字符串串联运算符。
6. 用 Transact-SQL 程序代替 PL/SQL 程序。
7. 把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。
8. 用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。
9. 把 PL/SQL 触发器转换为 Transact-SQL 触发器。
10. 使用 SET SHOWPLAN 语句,优化查询性能。
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 语句”中的示例。
剩余63页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0