ORACLE 中NDS(原生動態SQL)的幾個注意點

對於共享程序使用調用者權限

當a用戶的 shema下創建了一個程序,並賦予了這些程序的execute權限爲public

當b用戶登錄到自己的所屬shema 使執行如下命令:

sql> a.exec_ddl('create table table_a(id number)');

那麼則會在a 用戶下創建一個table_a的表,這其實不是我們想要的,我們想要在b用戶下建立表,那麼需要使用調用者權限模型,在存儲過程exec_ddl中聲明下

procedure exec_ddl(ddlstring in varchar2)
    AUTHID CURRENT_USER
IS
BEGIN
    EXECUTE IMMEDIATE ddl_string;
END;

動態sql中的異常處理

一個比較好的開發習慣是執行動態sql的時候加入異常處理和跟蹤機制

procedure exec_ddl(ddlstring in varchar2) 
	AUTHID CURRENT_USER 
IS
BEGIN
  EXECUTE IMMEDIATE ddl_string;
  
EXCEPTION 
	WHEN OTHERS THEN 
		dbms_output.pub_line('Dynamic SQL Failure : ' || DMBS_UTILITY.FORMAT_ERROR_STACK);
		dbms_output.pub_line('on statement  :" ' || ddl_string '"');  
END;

多使用變量綁定而非字符串拼接

好處如下:

  1. 綁定變量性能更高,這樣能夠利用緩存在SGA中的預解析遊標
  2. 避免隱式轉換和易於維護,一串數字如果當成字符的話需要加to_char,而變量綁定這避免了這個麻煩
  3. 安全性高,避免代碼注入
  4. 代碼簡潔易懂易於維護
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章