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