Oracle SQL 开发误区探索

时间:2023-12-05 08:09:02

本文内容摘自《剑破冰山——Oracle开发艺术》一书。

1、避免对列运算

要善于通过等价改写消除 SQL 中对列的运算,这样可以避免索引无法使用。

2、消除隐式转换

3、关注空格(避免粗心)

4、存储过程与权限

存储过程有编译和执行两个阶段,编译阶段,调用权限和定义权限是一样的,而执行阶段则不同。

5、提防 DDL 提交事务

DDL 语句会在当前 session 完成 commit 动作,即便这个 DDL 操作失败了也依然如此。事实上,DDL 语句执行的第一步就是 commit,然后才是执行 DDL 本身,无论命令本身是否执行成功,只要 DDL 关键字出现,系统就会提交。在存储过程中要避免因 DDL 出现而破坏了事务的原子性。

6、INSERT INTO 应列出全部字段

7、OR 条件(注意加括号)

8、SEQUENCE 中的 CACHE

刚创建的序列必须用 nextval 来获取初始值,否则会提示 ORA-08002。如果设置了序列的 cache 后执行"alter system flush shared_pool"清空内存,会导致被缓存的序列号丢失。重启数据库也会导致 cache 中的连续号被清空。实际应用中一般不会要求序列连续,可以通过 cache 提高插入速度,且 cache 不应太小,一般也不要超过 300 个,再多性能提升也不明显了。其实即便设置了 nocache,只要执行了 nextval(如插入失败)就会导致断号,所以 nocache 选项没什么用!

9、树形查询易错处

过滤条件最好在 start with 后面和 connect by 后面都写上,这样才能有效的避免重复展现记录(where 后面可以省略),熟练且正确的使用树形查询是非常有用的,将会给工作带来很大的方便。

10、小心保留字(V$RESERVED_WORDS,该视图出现的 keyword 都是关键字)

其中 reserved 为 'Y' 那些关键字(也就是 plsqldev 中默认会变粗那些关键字)是不能直接作为标识符使用的,除非用双引号包裹,但这会给查询带来不便。比较坑的关键字有 size、current_date 等。

11、函数索引陷阱

自定义函数使用函数索引,如果改变了函数代码则必须重建函数索引,否则 Oracle 将使用这个函数索引查询出错误的结果且不提示任何错误,这应该是 Oracle 的 BUG。

12、标量子查询

标量子查询只和外关联语句写法等价,与内关联语句可能不等价。
标量子查询要避免单行子查询返回多个行,可以返回 0 或 1 行,否则就会包 ORA-01427 错误。因此使用标量子查询的场合大多选择在两表关联皆为主键的场合,在特定场合,业务允许一对多关联并随机取一条时,我们需用 rownum=1 来限制返回行数。

本文链接http://www.cnblogs.com/hanzongze/p/oracle-sql-mistakes.html
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!