动态 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 语句时,它会先执行隐式提交。