動態 SQL

一些重要的評論:

  1. 切勿使用字串連線為查詢新增值,而是使用引數。這是錯的:

    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 每次執行時都會解析不帶引數的查詢,而帶引數的查詢只會在會話中解析一次。

  2. 請注意,當資料庫引擎執行 DDL 語句時,它會先執行隱式提交。