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

Oracle 實戰經驗(三):DBMS_SQL 動態 SQL 封裝過程詳解

     編輯:Oracle 資料庫基礎

DBMS_SQL 核心函數速查

函數用途
OPEN_CURSOR開啟新游標,回傳游標 ID
PARSE解析 SQL/PLSQL 陳述式
BIND_VARIABLE綁定變數值
DEFINE_COLUMN定義查詢欄位對應變數(僅 SELECT)
EXECUTE執行游標,回傳處理行數
EXECUTE_AND_FETCH執行並取首行
FETCH_ROWS取下一行
COLUMN_VALUE取得游標指定位置欄位值
IS_OPEN檢查游標是否開啟
CLOSE_CURSOR關閉游標釋放記憶體
LAST_ERROR_POSITION回傳錯誤位置位移
LAST_ROW_ID回傳最後一行 ROWID
LAST_SQL_FUNCTION_CODE回傳 SQL 功能代碼

完整範例:動態查詢索引數量

CREATE OR REPLACE PROCEDURE dml_sql (the_rq VARCHAR2) AS
  the_c1      INTEGER;
  the_result  INTEGER;
  m_jls       NUMBER;
  the_xh      VARCHAR2(2);
BEGIN
  the_xh := LPAD(LTRIM(the_rq), 2, '0');
  the_c1 := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(the_c1,
    'SELECT COUNT(*) FROM user_indexes WHERE table_name = ''ZDCHB''' || the_xh,
    DBMS_SQL.V7);
  DBMS_SQL.DEFINE_COLUMN(the_c1, 1, m_jls);
  the_result := DBMS_SQL.EXECUTE(the_c1);
  IF DBMS_SQL.FETCH_ROWS(the_c1) > 0 THEN
    DBMS_SQL.COLUMN_VALUE(the_c1, 1, m_jls);
    -- 處理 m_jls
  END IF;
  DBMS_SQL.CLOSE_CURSOR(the_c1);
END;
/

關鍵點提醒

  • PARSE 最後一個參數指定相容版本(V7、NATIVE 等)。
  • 動態 DDL/DML 需用 EXECUTE IMMEDIATE(9i+)更簡潔;DBMS_SQL 適用於未知欄位數/類型的查詢。
  • 務必 CLOSE_CURSOR 避免游標洩漏。
  • 錯誤處理可結合 LAST_ERROR_POSITION 定位問題 SQL 片段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved