PL/SQL & SQL CODING GUIDELINE 58 - Always use a string variable to execute dynamic SQL

條款五十八,總是使用字串變數去執行 Dynamic SQL。


像是下面這段程式直接將要執行的字串帶入執行 Dynamic SQL 就不被建議。

1
2
3
4
5
DECLARE
l_empno emp.empno%TYPE := 4711;
BEGIN
EXECUTE IMMEDIATE 'DELETE FROM emp WHERE epno = :p_empno' USING l_empno;
END;


建議的做法是用字串變數儲存要執行的 Dynamic SQL 語法,在將字串變數帶入動態運行。這樣的做法在串接複雜語句時會比較容易,在例外處理上若有需要也可以直接將變數拿來使用。

1
2
3
4
5
6
7
8
9
10
11
DECLARE
l_empno emp.empno%TYPE := 4711;
l_sql VARCHAR2(32767);
BEGIN
l_sql := 'DELETE FROM emp WHERE epno = :p_empno';
EXECUTE IMMEDIATE l_sql USING l_empno;
EXCEPTION
WHEN others
THEN
DBMS_OUTPUT.PUT_LINE(l_sql);
END;