绑定变量解决重编译问题
未使用绑定变量的语句
sprintf(sqlstr, "insert into scott.test1 (num1, num2) values (%d,%d)",n_var1, n_var2);
EXEC SQL EXECUTE IMMEDIATE :sqlstr ; EXEC SQL COMMIT;
使用绑定变量的语句
strcpy(sqlstr, "insert into test (num1, num2) values (:v1, :v2)"); EXEC SQL PREPARE sql_stmt FROM :sqlstr;
EXEC SQL EXECUTE sql_stmt USING :n_var1, :n_var2; EXEC SQL COMMIT;
绑定变量的注意事项
注意:
1、不要使用数据库级的变量绑定参数cursor_sharing来强
制绑定,无论其值为 force 还是similar
2、有些带> < 的语句绑定变量后可能导致优化器无法正确
使用索引
SQL语句的处理过程
SQL语句的四个处理阶段
SQL语句的处理过程
解析(PARSE):
- 在共享池中查找SQL语句
- 检查语法
- 检查语义和相关的权限
- 合并(MERGE)视图定义和子查询
- 确定执行计划
SQL语句的处理过程
绑定(BIND):
- 在语句中查找绑定变量
- 赋值(或重新赋值)
SQL语句的处理过程
执行(EXECUTE):
- 应用执行计划
- 执行必要的I/O和排序操作
提取(FETCH):
- 从查询结果中返回记录
- 必要时进行排序
- 使用ARRAY FETCH机制
共享游标:好处
- 减少解析
- 动态内存调整
- 提高内存使用率
书写可共享的SQL
绑定变量和共享游标