Oracle PL/SQL 與 Sybase/SQL Server T-SQL 在預存程序定義、游標操作、流程控制等方面存在顯著差異。本文以實際代碼對照,助您快速遷移與轉換。
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;
CREATE PROCEDURE sp_my
@p_yy datatype,
@p_nn datatype
AS
BEGIN
-- 無 RETURN 子句,透過 OUTPUT 參數或結果集返回
END
關鍵差異:Oracle 區分 Function(有返回值)與 Procedure(無返回值);T-SQL 僅有 Procedure,Function 受限較多。
-- 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;
FOR rec IN c_data(v_param) LOOP
-- 直接使用 rec.column_name
UPDATE ... WHERE CURRENT OF c_data; -- 可選
END LOOP;
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/SQL | Sybase/SQL Server T-SQL |
|---|---|---|
| 變數宣告 | v_name TYPE; | DECLARE @name TYPE; |
| 賦值運算子 | := | = |
| 註解 | -- 或 /* */ | -- 或 /* */ |
| 空值處理 | NVL(expr, val) | ISNULL(expr, val) / COALESCE |
| 條件邏輯 | DECODE / CASE | CASE / IIF |
| 迴圈 | LOOP ... END LOOP; | WHILE ... BEGIN ... END |
| 錯誤處理 | EXCEPTION WHEN ... THEN | TRY ... CATCH |
| 動態 SQL | EXECUTE IMMEDIATE | EXEC sp_executesql |
#temp),Oracle 採用 Global Temporary Table 或 PL/SQL Collection。BEGIN TRAN。SYSDATE ↔ GETDATE()、ROWNUM ↔ TOP/ROW_NUMBER())。