動態 SQL
一些重要的評論:
-
切勿使用字串連線為查詢新增值,而是使用引數。這是錯的:
execute immediate 'select value from my_table where id = ' || id_valiable into result_variable;
這是對的:
execute immediate 'select value from my_table where id = :P ' using id_valiable into result_variable;
有兩個原因。首先是安全問題。字串連線允許進行 SQL 注入。在下面的查詢中,如果變數將包含值
1 or 1 = 1
,則UPDATE
語句將更新表中的所有行:execute immediate 'update my_table set value = ''I have bad news for you'' where id = ' || id;
第二個原因是表現。Oracle 每次執行時都會解析不帶引數的查詢,而帶引數的查詢只會在會話中解析一次。
-
請注意,當資料庫引擎執行 DDL 語句時,它會先執行隱式提交。