首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 與 Sybase/SQL Server 預存程序語法差異實戰對照

     編輯:Oracle 資料庫基礎

核心差異概覽

Oracle PL/SQL 與 Sybase/SQL Server T-SQL 在預存程序定義、游標操作、流程控制等方面存在顯著差異。本文以實際代碼對照,助您快速遷移與轉換。

函數與程序定義語法對比

Oracle(CREATE OR REPLACE FUNCTION/PROCEDURE)

CREATE OR REPLACE FUNCTION my_func (
  p1 IN my_table.yy%TYPE,
  p2 IN my_table.nn%TYPE,
  p3 VARCHAR2
) RETURN VARCHAR2 AS
  -- 宣告區
BEGIN
  -- 執行區
  RETURN v_result;
END my_func;

Sybase/SQL Server(CREATE PROCEDURE/FUNCTION)

CREATE PROCEDURE sp_my
  @p_yy datatype,
  @p_nn datatype
AS
BEGIN
  -- 無 RETURN 子句,透過 OUTPUT 參數或結果集返回
END

關鍵差異:Oracle 區分 Function(有返回值)與 Procedure(無返回值);T-SQL 僅有 Procedure,Function 受限較多。

游標定義與操作差異

Oracle 顯式游標完整週期

-- 1. 宣告(可帶參數)
CURSOR c_data (v_param TYPE) IS SELECT ...;

-- 2. 開啟
OPEN c_data (v_value);

-- 3. 擷取
FETCH c_data INTO v_record;

-- 4. 判斷屬性
IF c_data%NOTFOUND THEN ...;
IF c_data%FOUND THEN ...;
WHILE c_data%FOUND LOOP ... END LOOP;

-- 5. 關閉
CLOSE c_data;

Oracle 隱式游標 FOR 迴圈(自動開啟/關閉)

FOR rec IN c_data(v_param) LOOP
  -- 直接使用 rec.column_name
  UPDATE ... WHERE CURRENT OF c_data; -- 可選
END LOOP;

T-SQL 游標語法

DECLARE cur CURSOR FOR SELECT ...;
OPEN cur;
FETCH NEXT FROM cur INTO @var1, @var2;
WHILE @@FETCH_STATUS = 0 BEGIN ... FETCH NEXT ... END;
CLOSE cur; DEALLOCATE cur;

關鍵語法差異速查表

項目Oracle PL/SQLSybase/SQL Server T-SQL
變數宣告v_name TYPE;DECLARE @name TYPE;
賦值運算子:==
註解-- 或 /* */-- 或 /* */
空值處理NVL(expr, val)ISNULL(expr, val) / COALESCE
條件邏輯DECODE / CASECASE / IIF
迴圈LOOP ... END LOOP;WHILE ... BEGIN ... END
錯誤處理EXCEPTION WHEN ... THENTRY ... CATCH
動態 SQLEXECUTE IMMEDIATEEXEC sp_executesql

遷移實務建議

  1. 游標邏輯重構:Oracle 偏好集合操作(BULK COLLECT/FORALL),避免逐行處理。
  2. 臨時表 vs 表變數:T-SQL 常用臨時表(#temp),Oracle 採用 Global Temporary Table 或 PL/SQL Collection。
  3. 事務控制:Oracle 隱式事務,COMMIT/ROLLBACK 明確;T-SQL 需 BEGIN TRAN。
  4. 系統函數對照:建立對照表(SYSDATE ↔ GETDATE()、ROWNUM ↔ TOP/ROW_NUMBER())。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved