Add Debug Information(編譯帶調試符號)。Test 開啟測試視窗。F9 或 Start Debugger,支援 Step Into/Over/Out、斷點、變數觀察、呼叫堆疊、即時修改變數。PRINT 'var=' + CAST(@var AS VARCHAR(20))INSERT INTO debug_log SELECT @var, GETDATE()。EXEC ('UPDATE ... WHERE ' + @dynamic_where)| 特性 | Oracle PL/SQL | SQL Server T-SQL |
|---|---|---|
| 結構 | EXCEPTION WHEN ... THEN ... | TRY ... CATCH ... |
| 預定義例外 | NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX 等 | 無直接對應,靠 ERROR_NUMBER()/ERROR_MESSAGE() |
| 自訂例外 | DECLARE e_custom EXCEPTION; PRAGMA EXCEPTION_INIT(e_custom, -20001); RAISE e_custom; | THROW 50001, 'message', 1; 或 RAISERROR |
| 錯誤資訊函數 | SQLCODE, SQLERRM, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE | ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE() |
| 全域錯誤變數 | 無(例外即物件) | @@ERROR (舊版), 建議用 TRY/CATCH |
| 事務控制 | 隱性事務,COMMIT/ROLLBACK 顯式 | 隱性/顯式 (SET IMPLICIT_TRANSACTIONS),XACT_STATE() 判斷可提交/需回滾 |
CREATE OR REPLACE PROCEDURE proc_sample (p_id IN NUMBER, p_result OUT VARCHAR2) AS
v_cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_cnt FROM t1 WHERE id = p_id;
IF v_cnt = 0 THEN
p_result := 'NOT_FOUND';
RETURN;
END IF;
UPDATE t1 SET status = 'PROCESSED' WHERE id = p_id;
p_result := 'SUCCESS';
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_result := 'NO_DATA';
ROLLBACK;
WHEN OTHERS THEN
p_result := 'ERR:' || SQLCODE || ':' || SQLERRM;
ROLLBACK;
-- 記錄至審計表
INSERT INTO error_log (proc_name, error_code, error_msg, log_time)
VALUES ('proc_sample', SQLCODE, SQLERRM, SYSTIMESTAMP);
-- 可選:RAISE 向上拋出
END proc_sample;
/
CREATE PROCEDURE proc_sample
@p_id INT,
@p_result VARCHAR(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF NOT EXISTS (SELECT 1 FROM t1 WHERE id = @p_id)
BEGIN
SET @p_result = 'NOT_FOUND';
ROLLBACK TRANSACTION;
RETURN;
END
UPDATE t1 SET status = 'PROCESSED' WHERE id = @p_id;
SET @p_result = 'SUCCESS';
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
SET @p_result = 'ERR:' + CAST(ERROR_NUMBER() AS VARCHAR) + ':' + ERROR_MESSAGE();
INSERT INTO error_log (proc_name, error_code, error_msg, log_time)
VALUES ('proc_sample', ERROR_NUMBER(), ERROR_MESSAGE(), SYSDATETIME());
-- 可選:THROW 向上拋出
END CATCH
END
GO
EXECUTE IMMEDIATE sql USING bind_vars; 綁定變數防注入、共享計畫。EXEC sp_executesql @sql, N'@p1 int, @p2 varchar(20)', @p1, @p2; 參數化執行。PRINT 或 DBMS_OUTPUT 完整 SQL 文本,複製至工具驗證語法與計畫。調試是開發期工作,錯誤處理是生產期生命線。投資於標準化模板、自動化測試與可觀測性建設,才能在系統規模增長時保持可控。