首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 存儲過程遷移至 Oracle:游標與動態 SQL 寫法差異示例

     編輯:程式設計綜合問答

原 SQL Server 存儲過程

使用動態 SQL 拼接字符串,聲明游標 cs_py 遍歷表中 fieldname2 為空的行,調用另一過程 sp_Public_PyWbm 計算拼音縮寫並更新回表。

Oracle 寫法關鍵差異

特性SQL ServerOracle
變量聲明DECLARE @var TYPEvar TYPE; (在 DECLARE 塊中)
動態 SQLEXEC('sql')EXECUTE IMMEDIATE 'sql' USING ...
游標DECLARE cur CURSOR FOR ...CURSOR cur IS SELECT ... (隱式/顯式)
循環WHILE @@FETCH_STATUS=0LOOP FETCH ... EXIT WHEN cur%NOTFOUND; END LOOP;

Oracle 等效示例

CREATE OR REPLACE PROCEDURE sp_Public_PyWbmGet(
    p_tablename   VARCHAR2,
    p_fieldname1  VARCHAR2,
    p_fieldname2  VARCHAR2,
    p_pybz        CHAR DEFAULT '0'
) AS
    v_sql      VARCHAR2(1000);
    v_name     VARCHAR2(255);
    v_shortcut VARCHAR2(255);
    CURSOR c_data IS
        SELECT p_fieldname1, p_fieldname2
        FROM p_tablename
        WHERE p_fieldname2 IS NULL
        FOR UPDATE OF p_fieldname2;
BEGIN
    FOR rec IN c_data LOOP
        -- 調用計算拼音過程 (需單獨遷移)
        sp_Public_PyWbm(rec.p_fieldname1, p_pybz, v_shortcut);
        UPDATE p_tablename
        SET p_fieldname2 = v_shortcut
        WHERE CURRENT OF c_data;
    END LOOP;
END;
/

注意事項

  • Oracle 不支持直接在動態 SQL 中聲明游標再 OPEN/FETCH,建議使用靜態游標 FOR rec IN ... LOOP 或 DBMS_SQL 包處理極度動態場景。
  • 表名、列名作為變量時,需用動態 SQL (EXECUTE IMMEDIATE) 拼接,注意防注入。
  • 參考:Oracle 動態 SQL 與游標實戰
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved