sql server与oracle存储过程在参数声明、主体结构、变量处理及调用方式上存在显著差异:sql server参数以@开头、类型后置output、用as和begin...end;oracle参数无@、方向前置、必须is/as和分号,变量用:=赋值,调用无需exec。

参数声明位置和语法格式不同
SQL Server 的参数写在 CREATE PROCEDURE 后括号内,以 @ 开头、类型紧随其后,OUTPUT 关键字放在类型之后;Oracle 则要求先写参数名,再用空格分隔出方向(IN/OUT/IN OUT),最后才是类型,且不加 @,也不强制指定长度(如 VARCHAR2 可不写长度)。
常见错误:把 SQL Server 风格的 @id int output 直接搬到 Oracle 里,会报错“PLS-00103”;反过来在 SQL Server 里写 id OUT INT 也会被拒绝。
- SQL Server 示例:
CREATE PROCEDURE proc_test @name VARCHAR(50), @age INT OUTPUT - Oracle 示例:
CREATE OR REPLACE PROCEDURE proc_test (name IN VARCHAR2, age OUT NUMBER)
主体结构关键字和分号使用习惯不同
SQL Server 用 AS 引出变量声明区,BEGIN...END 包裹逻辑体,语句末尾不强制加分号;Oracle 必须用 IS 或 AS(二者等价),BEGIN...END 是必需的,且每个 PL/SQL 语句结尾必须有分号 —— 少一个分号,整个存储过程编译失败。
容易踩的坑:从 SQL Server 迁移代码时漏掉分号,或误把 AS 当成可选而省略(Oracle 中不能省);还有人把 SQL Server 的 GO 当作块结束符照搬进 Oracle,结果报“ORA-00922: missing or invalid option”。
变量声明和赋值方式不兼容
SQL Server 在 DECLARE 块中定义变量,用 SET 或 SELECT @var = ... 赋值;Oracle 在 BEGIN 前的声明区用 variable_name TYPE := value; 一行完成声明+初始化,赋值统一用 :=,不能用 =。
典型错误现象:在 Oracle 存储过程中写 SET age = 25; 或 SELECT age = 25 FROM DUAL;,都会报错;SQL Server 里写 age := 25 则完全不识别。
- Oracle 正确写法:
v_age NUMBER := 25;或v_age := 25; - SQL Server 正确写法:
DECLARE @age INT; SET @age = 25;
调用方式和上下文依赖差异大
SQL Server 调用存储过程必须加 EXEC(或 EXECUTE),输出参数要显式带 OUTPUT 关键字;Oracle 直接写过程名即可(如 proc_test('Tom', v_out);),但前提是当前用户有执行权限,且若过程属于某个包,必须用 package_name.procedure_name 全限定调用。
性能影响点:Oracle 包(PACKAGE)能缓存编译后的代码,多次调用比独立过程快;SQL Server 没有原生包概念,所有过程都是独立对象,频繁调用时需注意计划缓存行为。
最常被忽略的是权限问题:Oracle 中即使过程创建成功,调用者没被授 EXECUTE 权限也会报 ORA-06550;SQL Server 默认 public 角色无权执行,也得手动授权,但错误信息不如 Oracle 明确。











