SQL Server vs Oracle 存储过程语法转换1.2
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 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存储过程语法详解存储过程是一种预编译的数据库对象,它包含了一系列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
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存储过程语法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 存储过程语法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的语法区别
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 语法一、概述这是一篇关于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`语句可以控制事务。
sqlserver存储过程语法
sqlserver存储过程语法SQL Server存储过程是一种预编译的数据库对象,它包含了一系列SQL语句和控制逻辑。
存储过程可以接收参数并返回结果,能够简化复杂的数据库操作,并提高性能和安全性。
下面是SQL Server存储过程的语法及其详细说明:1.创建存储过程```CREATE PROCEDURE procedure_nameASSQL_statements```- `procedure_name`为存储过程的名称- `SQL_statements`为存储过程的具体逻辑,可以包含一系列SQL语句和控制逻辑2.修改存储过程```ALTER PROCEDURE procedure_nameASSQL_statements```- `procedure_name`为要修改的存储过程的名称- `SQL_statements`为存储过程的具体逻辑,可以包含一系列SQL语句和控制逻辑3.删除存储过程```DROP PROCEDURE procedure_name```- `procedure_name`为要删除的存储过程的名称4.调用存储过程```EXECUTE procedure_name```- `procedure_name`为要调用的存储过程的名称5.存储过程的参数``````- `datatype`为参数的数据类型-`VARYING`用于指定参数长度为可变- `default_value`为参数的默认值-`OUTPUT`或`OUT`用于指定输出参数6.存储过程的返回结果存储过程可以使用`SELECT`语句返回结果集,也可以使用输出参数返回结果。
7.存储过程的控制流程存储过程可以使用各种控制流程语句,如`IF...ELSE`、`WHILE`、`CURSOR`等,用于实现逻辑判断和循环操作。
8.存储过程的错误处理存储过程可以使用`TRY...CATCH`块来处理错误,捕获异常并执行相应的错误处理逻辑。
SQL Server 与 Oracle 区别一: SQL Server的常用函数与Oracle的转换关系
SQL Server 与 Oracle 区别一: SQL Server的常用函数与Oracle的转换关系日期函数SQL Server OracleGetdate() SysdateDatediff(minute,BeginDate,endDate) (Trunc(EndDate,’MI’)-Trunc(BeginDate,’MI’))*24*60 Datediff(Hour,BeginDate,EndDate) (Trunc(EndDate,’HH’)-Trunc(BeginDate,’HH’))*24 Datediff(Day,Begindate,endDate) Trunc(EndDate,’DD’)-Trunc(BeginDate,’DD’) Datediff(month,Begindate,EndDate) Months_between(Enddate,BeginDate)Datediff(year,BeginDate,EndDate) Months_Between(EndDate,Begindate)/12 DateAdd(Day,n,Term) Term+nDateAdd(month,n,Term) Months_Add(term,n)DateAdd(year,n,Term) Months_Add(term,n*12)Datepart (Day,term) To_Number(To_Char(Term,’DD’))Datepart(month,term) To_Number(To_Char(Term,’MM’))Datepart(year,term) To_Number(To_Char(Term,’YYYY))Datepart(weekday,term) Trunc(Term,’dd’)-Trunc(term,’day’)+1DateAdd(Day,1-Day(Term),Term) Trunc(Term,’month’)DateAdd(Day,-Day(DateAdd(month,1,Term)), DateAdd(month,1,Term))Last_day(Term)数学函数SQL Server OracleRound(Num,s) Round(Num,s)Floor(Num) Floor(Num)Ceiling(Num) CEIL(num)字符函数SQL Server OracleCharindex(str1,string) Instr(string,str1)Substring(string,p,l) Substr(string,p,l)Left(string,l) substr(string,1,l)Right(string,l) substr(string,-1,l)Len(string) Length(string)Replace(string,str1,str2) Replace(string,str1,str2)Upper(string) Upper(string)Lower(string) Lower(string)Char(num) Chr(num)Ascii(s) Ascii(s)Str1+str2 Str1||str2类型转换函数SQL Server OracleCast(string as smalldatetime) To_Date(string,’YYYY-MM-DD HH24:MI:SS’) Cast(string as datetime) To_Date(string,’YYYY-MM-DD HH24:MI:SS’) Cast(string as int) To_number(string)Cast(String as decimal(p,s)) Round(To_Number(string),s)Cast(Number as varchar) To_char(number)Convert(varchar(10),term,120) To_Char(term,’YYYY-MM-DD’)Convert(varchar(19),term,120) To_Char(term,’YYYY-MM-DD HH24:MI:SS’)分组汇总函数SQL Server OracleSum(num) Sum(num)Avg(num) Avg(num)Count(*) Count(*)Max() Max()Min() Min()Isnull(string,str1) Nvl(String,str1)Isnull(Number,num1) Nvl(Number,num1)。
SQLServer与OracleSQL语法差异
SQLServer与OracleSQL语法差异以下差异将以SQL Server视⾓阐述1. 在创建函数或存储过程时,定义参数名前需要使⽤@符号1. 可以⽤ALTER PROCEDURE/FUNCTION来对已经存在的存储过程和函数的内容进⾏修改,Oracle的ALTER只可以⽤于重编译或debug。
2. 要进⾏Top-N查询时,应该使⽤SELECT TOP N [column_name]3. 进⾏Top-N查询时,以Top 10为例,如果第11、12条数据与第10条相同,也想将其进⾏输出时,应使⽤SELECT TOP N WITH TIES语句4. 如果要查询前10%的数据,可以使⽤SELECT TOP N PERCENT5. ⽤户变量名使⽤@前缀进⾏定义,⽽Oracle中是使⽤:来作为前缀1. SQL Server中没有dual虚表的概念,如果需要进⾏某函数结果的测试,直接SELECT即可。
2. Oracle捕获异常通常分为预定义和⾃定义异常,使⽤exception和when-then来进⾏捕获和异常信息抛出,⽽SQL Server中使⽤try-catch。
1. 两个数据库函数⼤部分相同,⼩部分不同的按照具体情况百度2. SQL Server中的数据库类似于schema,要使⽤哪个数据库,就使⽤use xx语句,如果要显⽰多个查询结果,则每个语句后跟go3. 做聚合分析时,SQL Server中的是grouping,Oracle中是grouping set4. 如果需要同时显⽰查询结果和⼩计,但是由于字段数量不同,⽆法⽤union显⽰,此时可以使⽤compute(Oracle中没有)1. Oracle中的with xx as后跟查询语句,⽽SQL Server中的CTE应该写成with xx (输出字段) as后跟查询语句2. SQL Server中使⽤游标遍历获取数据时,应使⽤fetch next,⽽Oracle中的是fetch,⽽且SQL Server的游标可以前后滚动;关闭游标时Oracle只需要写Close cursor就会关闭并释放资源,⽽SQL Server还需要DEALLOCATE CURSOR来释放资源。
ORACLE存储过程详解教程
ORACLE存储过程详解教程ORACLE是一种关系数据库管理系统,它支持存储过程的概念。
存储过程是一段预编译的SQL代码,可以被重复调用,用于实现复杂的业务逻辑。
在本篇文章中,我将详细介绍ORACLE存储过程的概念、语法和使用方法。
一、存储过程的概念存储过程是一种封装了一系列SQL语句的代码块,可以在数据库中创建和保存。
它可以接受输入参数,并返回输出参数。
存储过程通常用于实现复杂的业务逻辑,提高数据库的性能和安全性。
二、存储过程的语法在ORACLE中,可以使用CREATEPROCEDURE语句来创建存储过程。
以下是CREATEPROCEDURE语句的基本语法:```CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_name [IN , OUT , IN OUT] data_type [, ...])] [IS,AS]BEGIN--存储过程的SQL语句[EXCEPTION--异常处理代码END [procedure_name];```其中,CREATE PROCEDURE用于创建存储过程,OR REPLACE用于替换已存在的存储过程。
procedure_name是存储过程的名称。
parameter_name是存储过程的参数名,可以指定参数的类型(IN、OUT或IN OUT)。
data_type是参数的数据类型。
BEGIN和END之间是存储过程的代码块,可以包含多条SQL语句。
EXCEPTION用于处理异常情况。
三、存储过程的使用方法以下是一个简单的示例,演示了如何在ORACLE中创建和调用存储过程:```CREATE OR REPLACE PROCEDURE get_employee_name(p_employee_id IN NUMBER, p_employee_name OUT VARCHAR2)ISBEGINSELECT employee_name INTO p_employee_nameFROM employeesWHERE employee_id = p_employee_id;EXCEPTIONWHENNO_DATA_FOUNDTHENp_employee_name := 'Employee not found';END;```在这个例子中,我们创建了一个名为get_employee_name的存储过程。
SQLserver存储过程语法及实例
SQLserver存储过程语法及实例SQL Server存储过程是一种在数据库中预定义的、可重复使用的脚本,用于执行一系列的数据库操作。
它允许我们将一组相关的SQL语句封装在一个单独的程序单元中,可以通过调用存储过程来执行这些SQL语句,从而实现代码的复用和性能的优化。
本文将介绍SQL Server存储过程的语法和实例。
存储过程的语法可以分为四个主要部分:创建、参数、SQL语句和返回结果。
1.创建存储过程创建存储过程的语法如下:```sqlCREATE PROCEDURE <procedure_name>ASBEGIN-- SQL statementsEND```2.存储过程的参数存储过程可以接受输入参数和输出参数。
输入参数用于传递值给存储过程,输出参数用于返回值给调用者。
输入参数的语法如下:```sql```输出参数的语法如下:```sql```其中`OUTPUT`表示输出参数。
3.存储过程的SQL语句存储过程的主体可以包含一组SQL语句,用于执行数据库操作。
```sqlSELECT column1, column2, ...FROM table_nameWHERE condition;``````sqlINSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);``````sqlUPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition;``````sqlDELETE FROM table_nameWHERE condition;```上述示例中的`column1, column2, ...` 是表列的名称,`table_name`是表的名称,`condition`是WHERE条件,`value1, value2, ...` 是要插入或更新的值。
Oracle和SQL Server的一些区别(函数和存储过程)
Oracle和SQL Server的一些区别(函数和存储过程)函数SQLServer和Oracle的常用函数对比1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 as int) valueO:select trunc(-1.002) value from dual5.四舍五入S:select round(1.23456,4) value 1.23460O:select round(1.23456,4) value from dual 1.23466.e为底的幂S:select Exp(1) value 2.7182818284590451O:select Exp(1) value from dual 2.718281827.取e为底的对数S:select log(2.7182818284590451) value 1O:select ln(2.7182818284590451) value from dual; 18.取10为底对数S:select log10(10) value 1O:select log(10,10) value from dual; 19.取平方S:select SQUARE(4) value 16O:select power(4,2) value from dual 1610.取平方根S:select SQRT(4) value 2O:select SQRT(4) value from dual 211.求任意数为底的幂S:select power(3,4) value 81O:select power(3,4) value from dual 8112.取随机数S:select rand() valueO:select sys.dbms_random.value(0,1) value from dual;13.取符号S:select sign(-8) value -1O:select sign(-8) value from dual -1----------数学函数14.圆周率S:SELECT PI() value 3.1415926535897931O:不知道15.sin,cos,tan 参数都以弧度为单位例如:select sin(PI()/2) value 得到1(SQLServer)16.Asin,Acos,Atan,Atan2 返回弧度17.弧度角度互换(SQLServer,Oracle不知道) DEGREES:弧度-〉角度RADIANS:角度-〉弧度---------数值间比较18. 求集合最大值S:select max(value) value from(select 1 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select greatest(1,-2,4,3) value from dual19. 求集合最小值S:select min(value) value from(select 1 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select least(1,-2,4,3) value from dual20.如何处理null值(F2中的null以10代替) S:select F1,IsNull(F2,10) value from Tbl O:select F1,nvl(F2,10) value from Tbl--------数值间比较21.求字符序号S:select ascii('a') valueO:select ascii('a') value from dual22.从序号求字符S:select char(97) valueO:select chr(97) value from dual23.连接S:select '11'+'22'+'33' valueO:select CONCAT('11','22') ¦ ¦33 value from dual23.子串位置 --返回3S:select CHARINDEX('s','sdsq',2) valueO:select INSTR('sdsq','s',2) value from dual23.模糊子串的位置 --返回2,参数去掉中间%则返回7S:select patindex('%d%q%','sdsfasdqe') valueO:oracle没发现,但是instr可以通过第四霾问 刂瞥鱿执问?BR> select INSTR('sdsfasdqe','sd',1,2) value from dual 返回624.求子串S:select substring('abcd',2,2) valueO:select substr('abcd',2,2) value from dual25.子串代替返回aijklmnefS:SELECT STUFF('abcdef', 2, 3, 'ijklmn') valueO:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual26.子串全部替换S:没发现O:select Translate('fasdbfasegas','fa','我' ) value from dual27.长度S:len,datalengthO:length28.大小写转换 lower,upper29.单词首字母大写S:没发现O:select INITCAP('abcd dsaf df') value from dual30.左补空格(LPAD的第一个参数为空格则同space函数)S:select space(10)+'abcd' valueO:select LPAD('abcd',14) value from dual31.右补空格(RPAD的第一个参数为空格则同space函数)S:select 'abcd'+space(10) valueO:select RPAD('abcd',14) value from dual32.删除空格S:ltrim,rtrimO:ltrim,rtrim,trim33. 重复字符串S:select REPLICATE('abcd',2) valueO:没发现34.发音相似性比较(这两个单词返回值一样,发音相同)S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dualSQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差返回0-4,4为同音,1最高--------------日期函数35.系统时间S:select getdate() valueO:select sysdate value from dual36.前后几日直接与整数相加减37.求日期S:select convert(char(10),getdate(),20) valueO:select trunc(sysdate) value from dualselect to_char(sysdate,'yyyy-mm-dd') value from dual38.求时间S:select convert(char(8),getdate(),108) valueO:select to_char(sysdate,'hh24:mm:ss') value from dual39.取日期时间的其他部分S:DATEPART 和 DATENAME 函数(第一个参数决定)O:to_char函数第二个参数决定参数---------------------------------下表需要补充year yy, yyyyquarter qq, q (季度)month mm, m (m O无效)dayofyear dy, y (O表星期)day dd, d (d O无效)week wk, ww (wk O无效)weekday dw (O不清楚)Hour hh,hh12,hh24 (hh12,hh24 S无效)minute mi, n (n O无效)second ss, s (s O无效)millisecond ms (O无效)----------------------------------------------40.当月最后一天S:不知道O:select LAST_DAY(sysdate) value from dual41.本星期的某一天(比如星期日)S:不知道O:SELECT Next_day(sysdate,7) vaule FROM DUAL;42.字符串转时间S:可以直接转或者select cast('2004-09-08'as datetime) valueO:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;43.求两日期某一部分的差(比如秒)S:select datediff(ss,getdate(),getdate()+12.3) valueO:直接用两个日期相减(比如d1-d2=12.3)SELECT (d1-d2)*24*60*60 vaule FROM DUAL;44.根据差值求新的日期(比如分钟)S:select dateadd(mi,8,getdate()) valueO:SELECT sysdate+8/60/24 vaule FROM DUAL;45.求不同时区时间S:不知道O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;-----时区参数,北京在东8区应该是Ydt-------AST ADT 大西洋标准时间BST BDT 白令海标准时间CST CDT 中部标准时间EST EDT 东部标准时间GMT 格林尼治标准时间HST HDT 阿拉斯加—夏威夷标准时间MST MDT 山区标准时间NST 纽芬兰标准时间PST PDT 太平洋标准时间YST YDT YUKON标准时间Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:函数 Oracle Microsoft SQL Server把字符转换为ASCII ASCII ASCII字串连接 CONCAT (expression + expression)把ASCII转换为字符 CHR CHAR返回字符串中的开始字符(左起) INSTR CHARINDEX 把字符转换为小写 LOWER LOWER把字符转换为大写 UPPER UPPER填充字符串的左边 LPAD N/A清除开始的空白 LTRIM LTRIM清除尾部的空白 RTRIM RTRIM字符串中的起始模式(pattern) INSTR PATINDEX 多次重复字符串 RPAD REPLICATE字符串的语音表示 SOUNDEX SOUNDEX重复空格的字串 RPAD SPACE从数字数据转换为字符数据 TO_CHAR STR子串 SUBSTR SUBSTRING替换字符 REPLACE STUFF将字串中的每个词首字母大写 INITCAP N/A翻译字符串 TRANSLATE N/A字符串长度 LENGTH DATELENGTH or LEN列表中最大的字符串 GREATEST N/A列表中最小的字符串 LEAST N/A如果为NULL则转换字串 NVL ISNULL日期函数函数 Oracle Microsoft SQL Server日期相加 (date column +/- value) or ADD_MONTHS DATEADD两个日期的差 (date column +/- value) or MONTHS_BETWEEN DATEDIFF当前日期和时间 SYSDATE GETDATE()一个月的最后一天 LAST_DAY N/A时区转换 NEW_TIME N/A日期后的第一个周日 NEXT_DAY N/A代表日期的字符串 TO_CHAR DATENAME代表日期的整数 TO_NUMBER(TO_CHAR)) DATEPART日期舍入 ROUND CONVERT日期截断 TRUNC CONVERT字符串转换为日期 TO_DATE CONVERT如果为NULL则转换日期 NVL ISNULL转换函数函数 Oracle Microsoft SQL Server数字转换为字符 TO_CHAR CONVERT字符转换为数字 TO_NUMBER CONVERT日期转换为字符 TO_CHAR CONVERT字符转换为日期 TO_DATE CONVERT16进制转换为2进制 HEX_TO_RAW CONVERT 2进制转换为16进制 RAW_TO_HEX CONVERT其它行级别的函数函数 Oracle Microsoft SQL Server返回第一个非空表达式 DECODE COALESCE 当前序列值 CURRVAL N/A下一个序列值 NEXTVAL N/A如果exp1 = exp2, 返回null DECODE NULLIF 用户登录账号ID数字 UID SUSER_ID用户登录名 USER SUSER_NAME用户数据库ID数字 UID USER_ID用户数据库名 USER USER_NAME当前用户 CURRENT_USER CURRENT_USER用户环境(audit trail) USERENV N/A在CONNECT BY子句中的级别 LEVEL N/A合计函数函数 Oracle Microsoft SQL Server Average AVG AVGCount COUNT COUNTMaximum MAX MAXMinimum MIN MINStandard deviation STDDEV STDEV or STDEVP Summation SUM SUMVariance VARIANCE VAR or VARPOracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域:EXTRACT(YEAR FROM 日期)存储过程一.多表连接查询,更新存储过程Sql存储过程ALTER PROCEDURE [dbo].[ GetEvent]@SCSWId nvarchar(20)= null ,@ToDate DATETIME,@FromDate DATETIMEASSELECT NOTES.NOTE_ID,NOTES.NOTE,SCSW_CALENDAR.DATE_TIMEFROM SCSW_CALENDARLEFT OUTER JOIN NOTES ON SCSW_CALENDAR.NOTE_ID=notes.note_idWHERE SCSW_CALENDAR.SCSW_ID = SCSWIdORDER BY Patient.PatientIdOracel存储过程1.查询数据的存储过程PROCEDURE GetEvent(SCSWId IN VARCHAR2, FromDate IN DATE, ToDate IN DATE, refOut OUT refcursor)ISBEGINOPEN refOut FORselect NOTES.NOTE_ID,NOTES.NOTE,SCSW_CALENDAR.DATE_TIMEfrom SCSW_CALENDARleft join NOTES on SCSW_CALENDAR.NOTE_ID=notes.note_idwhere SCSW_CALENDAR.SCSW_ID = SCSWIdAND SCSW_CALENDAR.DATE_TIME >= FromDateAND SCSW_CALENDAR.DATE_TIME < ToDateorder by SCSW_CALENDAR.DATE_TIME;END GetEvent;2.更新数据的存储过程:procedure UpdateArticlesubmodel(ArticleSubID number,ArticleTitle nvarchar2,ArticleKeyWord nvarchar2, ArticleContent CLOB,CreatePerson nvarchar2,ChangeDate date,SetTop number,ArticleSubStyleID number,Checked number)asbeginupdate "ArticleSubModel"set "ArticleTitle"=ArticleTitle, "ArticleKeyWord"=ArticleKeyWord, "ArticleContent"=ArticleContent, "CreatePerson"=CreatePerson, "CreateDate"=ChangeDate,"SetTop"=SetTop, "ArticleSubStyleID"=ArticleSubStyleID, "Checked"=Checkedwhere "ArticleSubID"=ArticleSubID; commit;Exception when others thenrollback;end UpdateArticlesubmodel;3.删除数据的存储过程procedure DeleteArticlesubmodel(ArticleSubID number)asbegindelete from "ArticleSubAccessories"where "ArticleSubID"=ArticleSubID;delete from "ArticleSubModel"where "ArticleSubID"=ArticleSubID;commit;Exception when others thenrollback;end DeleteArticlesubmodel;编后:如果您认为有侵权的地方,请来信说明,本人将立即删去。
SqlServer与Oracle语法差异
13
Oracle中没有selectsysdateasnowDate的写法,正确的应该是加个虚表dual
selectsysdateasnowDatefrom dual
14
Oracle中,字段名,表名,别名,索引名,视图名等名称的长度不能超过30个字符
15
Oracle中,字段名都是大写的,即使select语句中是小写,得到的结果也是大写。因此,select到DataTable中后,binding到wpf时如果大小写不同,会绑定失败。在DataTable中分组和排序,也会失败。因此,尽量将DataTable中的字段名称改为大写。
{
if (Global.CacheServerConfiger.IsOracle)
{
_sqlserverSql= _sqlserverSql.Trim();
if (!_sqlserverSql.EndsWith(";"))
{
_sqlserverSql+= ";";
}
_sqlserverSql= _sqlserverSql.Replace("\r\n", " ").Replace("\n", " ");
4
sql语句中的+,改为||
5
Oracle中,在sql中做除法时,需要进行以下操作,否则c#中会算术溢出
round(count(*)/(cast(3 as float)), 28) --cast(3 as float)是为了和sqlserver保持一致,28是最大精度,不能大于28
6
日期在SqlServer中可以按照字符串操作,但在Oracle中不行
sql server 存储过程语法
sql server 存储过程语法SQL Server 存储过程是一种预编译的、可复用的存储对象,其中包含一组可由应用程序调用的 T-SQL 语句。
存储过程可以接受输入参数和输出参数,并能够对相关表进行插入、更新、删除等操作。
下面是 SQL Server 存储过程的语法和使用方法,以及相应的案例。
1.语法:```sqlCREATE [ OR ALTER ] PROCEDURE procedure_name[ @parameter [ data type ] [ = default ] [ OUT | OUTPUT | INOUT ] ] ASBEGIN-- T-SQL statement(s)ENDGO```2.使用方法:1. 创建存储过程:使用 CREATE PROCEDURE 创建存储过程,设置存储过程名称、输入参数、输出参数和 T-SQL 语句等。
2. 执行存储过程:通过 EXECUTE 或 EXEC 命令执行存储过程,并传递相关的参数。
3. 删除存储过程:使用 DROP PROCEDURE 删除存储过程。
3.案例:假设有一张 Students 表,包含学生的名字、学号和成绩等信息。
现在需要创建一个存储过程,根据输入的学号查询对应学生的成绩,并返回查询结果。
下面是存储过程的实现代码:```sqlCREATE PROCEDURE Proc_GetStudentScore@student_id INT,@score INT OUTASBEGINSELECT @score = Score FROM Students WHERE StudentID = @student_id;END```在上面的代码中,存储过程 Proc_GetStudentScore 包含一个输入参数@student_id 和一个输出参数@score。
T-SQL 语句通过查询 Students 表,获取指定学号的学生成绩,并将结果存储在 @score 参数中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 语句解决。