SQL Server vs Oracle 存储过程语法转换1.2

合集下载

sql server存储过程语法

sql server存储过程语法

sql server存储过程语法存储过程是数据库程序设计的一种编程技术,其用途有:自动执行重复执行的查询、操作系统自动调度执行的任务等;本文主要介绍了SQL Server存储过程的语法及其相关概念。

1、创建存储过程:CREATE PROCEDURE proc_nameASSql statementsGO上面的CREATE PROCEDURE关键字用于在SQL Server中创建存储过程,其中proc_name是存储过程的名字,后面遵循一般的T-SQL语法,即执行其他查询、更新和设定指令来处理数据等操作。

@para1 INT,@para2 VARCHAR(100)上面的语法为存储过程的参数声明,也可以通过关键字 DECLARE 来声明参数;其中@para1和@para2分别表示存储过程的参数,在定义存储过程参数时可以使用SQL Server 所支持的各种类型,例如:CHAR(n) 、 BINARY(n)、VARCHAR(n)、INT、 FLOAT、DATETIME等。

3、内置函数:内置函数是用于取得有关SQL Server系统信息以及其他相关信息的函数,如:GETDATE()、DATEPART()等函数,可以在存储过程中使用,它们可以帮助我们确定系统级别的参数。

4、特殊变量:特殊变量是指不需要事先定义,在存储过程运行时系统自动进行初始化的变量,它们可提供有关当前连接信息,如:@@Error、 @@FETCH_STATUS、@@ROWCOUNT等。

二、SQL Server存储过程相关概念1、游标:游标是在存储过程中遍历表中记录的一种机制,它允许对表中的记录进行操作,可以对表中的记录进行“定义-打开-读取-关闭”的循环操作,其中定义、打开是开始使用游标的预处理操作,而读取和关闭则是完成操作时的收尾工作。

2、事务:事务是指由一系列的操作组成的逻辑单元,事务在操作完成时必须是完整的。

SQL Server存储过程支持事务处理,可以通过BEGIN TRANSACTION、COMMIT TRANSACTION和ROLLBACK TRANSACTION控制事务的处理,以确保只有全部操作成功时最终才更新数据库中的数据。

SQL中调用ORACLE存储过程

SQL中调用ORACLE存储过程

SQL Server调用Oracle的存储过程收藏原文如下:通过SQL Linked Server 执行0rac 1 e存储过程小结1举例我们可以通过下面的方法在SQL Server中通过Linked Server来执行Oracle存储过程。

(1)Oracle PackagePACKAGE Test PACKAGE ASTYPE t_t is TABLE of VARCHAR2(30)INDEX BY BINARY,INTEGER;PROCEDURE Test procedure1(p BATCH」D IN VARCHAR2,p__Number IN number,P.MSG OUT t_t.p MSG1 OUT t_t);END Test PACKAGE;PACKAGE BODY Test PACKAGE ASPROCEDURE Test procedure1(p BATCH一ID IN VARCHAR2,p Number IN number,P.MSG OUT t_t,p MSG1 OUT t_t)ASBEGINp. MSGp. MSG(2): = ,b,;p. MSG(3)=a‘;p MSGl(l):= Qbc‘;RETURN;MIT;EXCEPTIONWHEN OTHERS THENROLLBACK;END Test procedure1;END Test PACKAGE;(2)在SQL Server中通过Linked Server 来执行Oracle 存储过程declare BatchID nvarchar (40)declare QueryStr nvarchar (1024)declare StatusCode nvarchar(100)declare sq1 nvarchar(1024)set BatchID=,AM*SET QueryStr=, {CALL GSN. Test_PACKAGE. Test_procedurel(* * *1,+BatchID+,1'".八'‘4’'''.{resultset 3. p_MSG}.{resultset 1, p_ MSG1})}1(3)执行结果(a)select sql=r SELECT StatusCode=p. msg FROM OPENQUERY (HI4DB__MS,r11-Query Str+''')'exec sp executesql sql,N f StatusCode nvarchar(100) output*,StatusCode outpu tprint StatusCode答案:StatusCode=, a'(b) select sql=f SELECT top 3 StatusCode=p_msg FROM OPENQUERY (HI4DB MS,-QueryStr+,,F)rexec sp_executesql sql,N1StatusCode nvarchar(100) output *.StatusCode outpu print StatusCode答案:StatusCode=, a(c)select sql=f SELECT top 2 StatusCode=p_msg FROM OPENQUERY (HI4DB MS,1r r -QueryStr+,,f)rexec sp_executesql sql.N1StatusCode nvarchar(100) output r.StatusCode outpu tprint StatusCode答案:StatusCode=, b'(d)select sql=r SELECT top 1 StatusCode=p_msg FROM OPENQUERY (HI4DB MS,1'r-QueryStr+,,f)rexec sp executesql sqlStatusCode nvarchar(100) output1,StatusCode outpu print StatusCode答案:StatusCode二'c(e)SET QueryStr=,{CALL GSN. Test.PACKAGE. Test procedure1C11f,+BatchID+,11 *r / 1''4'' '' • {resultset 1, p. MSG1}. {resultset 3. p_MSG})}'----------------------------------- (注意这里p_MSG1 和P MSG交换次序了)EXEC(r SELECT p…msgl FROM OPENQUERY (HI4DB MS/r,-QueryStr+,r1)r) select sql=r SELECT StatusCode=p_msgl FROM OPENQUERY (HI4DB MS/r,-QuerySexec sp executesql sql,N*StatusCode nvarchar(100) output*,StatusCode outpuprint StatusCode答案:StatusCode=" abc*2上述使用方法的条件(1)Link Server 要使用Microsoft 的Driver (Microsoft OLE DB Provider fo r Oracle)(2)Oracle Package中的Procedure的返回参数是Table类型,目前table只试成功一个栏位。

SQLSERVER存储过程语法详解

SQLSERVER存储过程语法详解

SQLSERVER存储过程语法详解存储过程是一种预编译的数据库对象,它包含了一系列SQL语句和逻辑控制语句,用于实现特定的功能。

SQLSERVER存储过程的语法如下:1.创建存储过程:```sqlCREATE PROCEDURE procedure_nameASBEGIN--逻辑控制语句和SQL语句END```2.删除存储过程:```sqlDROP PROCEDURE procedure_name```使用DROP语句可以删除已经存在的存储过程。

3.修改存储过程:```sqlALTER PROCEDURE procedure_nameASBEGIN--逻辑控制语句和SQL语句END```ALTER语句可以修改已经存在的存储过程的参数、逻辑控制语句和SQL语句。

4.调用存储过程:```sqlEXEC procedure_name```使用EXEC语句可以调用存储过程并传递参数。

参数可以按名称传递,也可以按位置传递。

5.存储过程中的逻辑控制语句:存储过程中可以使用IF、ELSEIF、ELSE、WHILE、FOR等逻辑控制语句,用于控制程序的执行流程。

6.存储过程中的SQL语句:存储过程中可以使用所有的SQL语句,包括SELECT、INSERT、UPDATE、DELETE等。

可以使用表、视图、触发器等数据库对象。

7.存储过程的返回值:存储过程可以返回一个或多个值,使用以下语句将结果返回给调用者:```sqlRETURN value```在存储过程中使用RETURN语句返回一个整数值。

这个整数值通常用于指示存储过程的执行状态。

8.存储过程的输出参数:存储过程可以定义输出参数,用于将结果返回给调用者。

在创建存储过程时,可以使用OUTPUT关键字定义输出参数。

存储过程是SQLSERVER中非常强大的功能,它可以提高数据库的性能和安全性,减少网络通信的开销。

通过了解存储过程的语法,可以更好地利用存储过程解决实际的问题。

sql_server转oracle

sql_server转oracle
◆视图中如果用了order by ,并且order by 从句中的字段名都是别名,那么,在显示视图时必须显示出order by 子句中的所有字段,例如,有下面这样一个视图:
create view v
as
select name as c1,address from t1 order by c1
bit NUMBER (1, 0)
char (10) CHAR (10)
datetime DATE
decimal (18 , 0) NUMBER (18, 0)
float FLOAT
create global temporary table table1(c int) on commit preserve rows
这个table1在数据库中是永久存在的,所以不要是用drop命令,在你的程序中在对这个表进行任何操作之前,先执行truncate table table1,切忌不要用drop命令删除此表。;
◆数据类型的转换;
◆ORACLE中对象名不能超过30个字符。ORACLE中界限符是“”(对应SQLSERVER中的[ ])(我的建议是:最好不要是用界限符,能避免实用系统的保留字就尽量避免);
◆ORACLE中空字符串被看成null;
◆ORACLE中字符的比较是区分大小写的;
(3)select * from t1 left join t2 on t1.c1=t2.c1
ORA: select * from t1,t2 where t1.c1=t2.c1(+)
(4)SQL:select * from t1 right join t2 on t1.c1=t2.c1
1.部分SQL语句差异

sqlserver存储过程语法

sqlserver存储过程语法

sqlserver存储过程语法SQL Server 是目前使用最广泛的关系型数据库管理系统之一,它提供了一种高效的方式来处理大规模数据,并提供了许多高级功能来支持企业级应用程序的开发和部署。

其中之一就是存储过程。

存储过程是一组预先编写的 SQL 语句和程序逻辑,它们可以被存储在 SQL Server 数据库中,以便使用。

存储过程可以简化复杂的 SQL 查询,提供高效的数据访问,增强数据安全性,以及提高可维护性和可扩展性。

SQL Server 存储过程的基本语法如下:CREATE PROCEDURE procedure_name AS BEGIN -- 存储过程的逻辑代码 END在这个语法结构中,CREATE PROCEDURE 用于创建一个新的存储过程。

procedure_name 是新创建的存储过程的名称,在逻辑代码中需要使用该名称以引用存储过程。

AS 指令开始了存储过程的逻辑代码的定义,而 BEGIN 和 END 指令包含了实际的存储过程逻辑代码。

下面是一个简单的例子,展示了如何定义一个基本的SQL Server 存储过程:CREATE PROCEDURE GetCustomerList AS BEGIN SELECT * FROM Customers END在这个例子中,存储过程名称为 GetCustomerList,它包含了一个简单的 SELECT 语句用于从 Customers 表中检索所有列的数据。

在实际中,存储过程可以执行更复杂的查询并返回更有意义的数据结果。

除此之外,SQL Server 存储过程还支持许多其他的语法元素,其中一些最常见的包括:1. 参数声明存储过程可以接受参数,这些参数可以是输入参数,也可以是输出参数。

以下是一个接受输入参数的例子:CREATE PROCEDURE GetCustomerByID @CustomerID int AS BEGIN SELECT * FROM Customers WHERE CustomerID = @CustomerID END在这个例子中,存储过程 GetCustomerByID 接受一个名为 @CustomerID 的整数类型参数。

sql server 存储过程语法

sql server 存储过程语法

SQL Server 存储过程语法1. 什么是存储过程存储过程是一组预编译的SQL语句的集合,它们被保存在数据库中,并可以通过一个单独的调用来执行。

存储过程通常用于执行重复性的任务,提高数据库操作的效率和性能。

2. 存储过程的优势使用存储过程有以下几个优势:•提高性能:存储过程在数据库中预编译并缓存,可以减少数据库服务器的负载,提高查询和数据操作的速度。

•减少网络流量:存储过程可以将复杂的业务逻辑在数据库端执行,只将结果返回给客户端,减少了网络传输的数据量。

•增强安全性:存储过程可以对数据库的操作进行权限控制,只允许授权用户执行特定的操作,提高了数据库的安全性。

•提高代码的重用性:存储过程可以被多个应用程序共享和调用,减少了代码的重复编写,提高了开发效率。

3. 存储过程的语法结构存储过程的语法结构如下:CREATE PROCEDURE procedure_name[ @parameter1 datatype [ = default_value ] ][ , @parameter2 datatype [ = default_value ] ]...ASBEGIN-- 存储过程的逻辑代码END•CREATE PROCEDURE:用于创建存储过程的关键字。

•procedure_name:存储过程的名称,遵循数据库命名规则。

•@parameter:存储过程的参数,可以有零个或多个参数。

•datatype:参数的数据类型。

•default_value:参数的默认值,可选。

•AS:用于开始存储过程的逻辑代码块。

•BEGIN和END:用于定义存储过程的逻辑代码的开始和结束。

4. 存储过程的参数存储过程可以接受零个或多个参数,参数可以是输入参数、输出参数或输入输出参数。

4.1 输入参数输入参数用于向存储过程传递数据,存储过程可以使用这些参数进行计算、查询或更新操作。

输入参数可以在存储过程内部使用,但不能修改参数的值。

Oracle和SQL_Server的语法区别

Oracle和SQL_Server的语法区别

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 语句语法类似。

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 运算符,用于查找学生登记的所有课程的代码和名称。

sqlserver mysql oracle 语法

sqlserver mysql oracle 语法

sqlserver mysql oracle 语法一、概述这是一篇关于SQL Server,MySQL和Oracle的语法对比文档。

我将概述这三种数据库系统的主要概念和语法,以便您了解它们之间的差异。

二、SQL Server语法1. 创建数据库:使用`CREATE DATABASE`语句可以创建新的数据库。

语法如下:```sqlCREATE DATABASE database_name;```2. 创建表:使用`CREATE TABLE`语句可以创建新的表。

语法如下:```sqlCREATE TABLE table_name (column1 datatype,column2 datatype,...);```3. 插入数据:使用`INSERT INTO`语句可以将数据插入到表中。

语法如下:```sqlINSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);```4. 查询数据:使用`SELECT`语句可以查询数据。

基本的语法如下:```sqlSELECT column1, column2, ...FROM table_nameWHERE condition;```5. 更新数据:使用`UPDATE`语句可以更新现有数据。

基本的语法如下:```sqlUPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;```6. 删除数据:使用`DELETE`语句可以删除数据。

基本的语法如下:```sqlDELETE FROM table_nameWHERE condition;```7. 事务处理:SQL Server支持事务处理,以确保数据的一致性和完整性。

使用`BEGIN TRANSACTION`, `COMMIT`, 和 `ROLLBACK`语句可以控制事务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、SQL Server vs Oracle 简单语法比较此为本人将ORACLE 函数和存储过程转换为SQL SERVER遇到的一些语法问题的经验总结,肯定不能包括所有的语法不同点。

注:简单的语法异同1、SQL SERVER变量必须以@开头。

2、SQL SERVER语句后不需要写分号结束符。

3、oracle变量类型number 可以修改为sql server的decimal4、oracle变量类型varchar2 可以修改为sql server的varchar5、SQL SERVER定义变量及传递参数,最好加上参数大小数值,例如:varchar(50)5、SQL SERVER 不能用ROWID, ROWNUM (但可以用TOP代替)6、oracle里的nvl函数,在SQL SERVER里使用ISNULL函数取代7、SQL SERVER自定义函数不允许修改全局表数据(只允许修改自定义函数范围内表数据), 所以发生表修改的最好用存储过程实现而非函数。

1 create函数或存储过程异同点Oracle 创建函数或存储过程一般是create or replace ……SQL SERVER 则是在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程。

函数语句if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[函数名]GO存储过程if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[存储过程名]GO2 结构异同点ORACLECreate 部分IS 定义部分BEGIN … END; 实现部分SQL SERVERCreate 部分AS 定义和实现部分(AS 下面的代码一般用BEGIN … END 包含)3 调用参数ORACLE输入参数参数名In 参数类型ORACLE输出参数参数名Out 参数类型SQL SERVER输入参数参数名参数类型IN(IN可以不写,系统默认)SQL SERVER输出参数参数名参数类型OUTPUT4 变量命名及赋值ORACLE1、变量名随便取2、定义格式为变量名变量类型;3、给变量赋值为变量名:= 值;SQL SERVER1、变量名前面一般加@2、定义格式为declare 变量名变量类型3、SET变量名=变量类型5 IF语句ORACLEIF … THEN….ELSE...END IF;SQL SERVERIF ... BEGIN……ENDELSE BEGIN……END或者IF ...BEGIN……ENDELSEBEGIN……END6 case语句ORACLEIF … THEN….ELSE...END IF;SQL SERVERIF ... BEGIN……ENDELSE BEGIN……END或者IF ...BEGIN……ENDELSEBEGIN……END7 游标的定义及使用及循环操作ORACLE定义游标CURSOR CurA IS SELECT a FROM tab where …;SQL SERVER定义游标DECLARE CurA CURSOR LOCAL FOR SELECT a FROM tab where … ;ORACLE使用游标Open CurA; -- 打开游标Fetch CurA Into ISUserUnitPri;IF CurA%NOTFOUND THEN -- 注:如果为CurA%FOUND,看下面相同位置注释ISUserUnitPri := 1;END IF;Close CurA; -- 关闭游标SQL SERVER使用游标Open CurA -- 打开游标Fetch next from CurA Into @ISUserUnitPriIF @@fetch_status <> 0 BEGIN -- 注:则@@fetch_status = 0 SET @ISUserUnitPri = 1 -- 没有选到记录给默认值1ENDClose CurA -- 关闭游标DEALLOCATE CurA -- 释放占用资源ORACLE循环操作游标(超级简洁)FOR ISUserUnitPri IN CurA LOOP…–- 做操作END LOOP;注:想循环中间退出循环,用EXITSQL SERVER循环操作游标Open CurA -- 打开游标Fetch next from CurA Into @ISUserUnitPriWhile ( @@fetch_status = 0 ) BEGIN…. –- 做操作Fetch next from CurA Into @ISUserUnitPriENDClose CurA -- 关闭游标DEALLOCATE CurA -- 释放占用资源注:想循环中间退出循环,用BREAK注意:SQL SERVER 使用游标完后,需要删除游标引用(DEALLOCATE cursor_name)。

8 计算时间差ORACLEOracle 两个时间相减得到一个以天为单位的带小数的值,需要根据自己的需要再换算成秒值。

-- 这里为取START_QUEUE_TIME到当前时间的秒数(SYSDATE - START_QUEUE_TIME)*24*60*60SQL SERVERSQL SERVER两个时间相减得到还是时间(从1900-01-01 00:00:00.000开始的时间)。

所以想得到以秒的时间差,这么做就麻烦了。

SQL SERVER取时间差,专门有一个DATEDIFF函数,具体看SQL SERVER帮助。

-- 这里为取START_QUEUE_TIME到当前时间的秒数DATEDIFF(second, START_QUEUE_TIME,GETDATE())9 top N 问题在sql server中,top N 问题很容易解决,如下例:从表stbdbdj中选取排序后的第一行数据进行赋值。

在sql中解决方法很简单,在select 后面加上:top n 即可,其中n 代表行数。

select top1@entrust_date= entrust_date,@entrust_no= entrust_nofrom run2k..stbdbdjwhere entrust_date =@dateand entrust_no >@entrust_no_qand report_status ='1'order by entrust_date,entrust_no;在oracle中,没有top n这个命令,我们采取把两层查询方式解决:首先,把需要查找的字段值直接进行排序,然后在外面进行第二次查询,并使用rownum决定行数。

select entrust_date,entrust_nointo@entrust_date, @entrust_nofrom ( select entrust_date,entrust_nofrom stbdbdjwhere entrust_date =@dateand entrust_no >@entrust_no_qand report_status ='1'order by entrust_date,entrust_no )where rownumber <=1 ;10 如何解决结果集返回时,* 和变量同时存在的问题下面例子表示,在用游标返回结果集时,同时返回一个变量的值,在sql server中代码如下所示:select a.*,an_idfrom run2k..stbbp a,run2k..stkaccoarg bwhere a.date =@entrust_dateand a.serial_no =@serial_noand a.branch_no = b.branch_noand a.exchange_type = b.exchange_type;但在oracle中却没有这种用法,’*’后面必需跟from。

解决方法如下:1)我们可以把'*' 变成所需要选择的字段,就是说采用表中需要显示的全部字段表示*。

例如:open p_cursor forselect branch_no,...,organ_idwhere...2)如果这个字段或者说变量是从另外一张表中取出来的,同样可以采用下面的办法。

open p_cursor forselect a.*,an_id;from stkaccoentrust a, stkaccoarg bwhere a.branch_no = b.branch_noand a.exchange_type = b.exchange_typeand a.init_date = v_entrust_dateand a.serial_no = v_serial_no;11 外联接问题Sql server <---> oraclea = *b <---> a(+)= ba *=b <---> a = b(+)12 多条记录求和问题select sum(A+B+C)into Dfrom ...where ...group by ...单条记录求和select A+Binto Cfrom ...where ...13 用SQL SERVER里CASE函数替换DECODE函数替换ORACLEdecode(client_status,'0','正常,'1','冻结','2','挂失','3','销户','未知');SQL SERVER 没有DECODE函数case client_statuswhen '0' then '正常'when '1' then '冻结'when '2' then '挂失'when '3' then '销户'else '未知'end注:有趣的是ORACLE的CASE函数,在SQL SERVER里没有找到替代的,只好用IF ELSE 语句解决。

相关文档
最新文档