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 片段。