找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 554|回复: 0

[【求助】] 一名工程师的泣血控诉

[复制链接]
发表于 2007-2-10 20:33:53 | 显示全部楼层 |阅读模式
一个伟人有些小小的缺点,也许更可爱,下面就来看看Oracle这位伟人的毛病。当然,是否毛病,只是一家之言,有人就觉得特好,正如林妹妹病怏怏的样子在贾宝玉眼里特别美一样。



   本文纯为牢骚, 怨言。一为笔者对ORACLE软件如此这般的疑惑与不满,二来其实可以总结ORACLE中的一些不规则性,
为ORACLE学习者提供一些借鉴..



   1. 改变当前用户时SQLPLUS环境变量的设置是否被继承到新的用户环境下  混乱, serverout 没有被继承,
而pagesize被继承.



   2. SQLPLUS环境下命令行编辑功能微弱得可怜, 看看readline, 看看MySQL



   3. SQLPLUS环境的命令行没有历史记录功能, 看看MySQL. gdb, bash



   4. 命名规范混乱得一踏糊涂. user_tab_columns, user_con_constraints user_tables,
usre_cons_columns


   5. SQLPLUS环境的初始化文件的location的要求, 看看.bashrc, .vimrc,
.netrc.emacs,.newsrc...摸一个都比它强, 我要使用你的login.sql还非得在每一个当前目录下都弄一份,
随身携带呀?好在这一点可以通过SQLPATH环境变量的设置来搞定.


   6. 注释格式:--, 什么玩意呀, HTML用, perl用#, php用#或/**/或//, C用/**/, C++用/**/和//, lisp用;;,
汇编用;, QBASIC用rem 和',SHELL,SED,AWK用#, 你干吗要自创一种. 自以为很鸟啊, 与别人兼容一点会小你什么身份.



   7. 看看它的PL/SQL,
号称第N代的高级语言,function因为必需返回一个值而存在,除此之外我看不出它与其它的procedure有什么区别.
又是trigger,又是package,又是procedure, 又是function, 搞什么东东呀. 别人是把复杂的东西简单化,
我看ORACLE是要把简单的东西复杂化,同样是PL/SQL程序,
dbms_output.put_line被设计成在function里单独调用时不能输出.非要一个procedure单独调用它时它才会输出.



   8. 单引号问题, JavaSCRIPT可以兼容使用单双引号, perl可以,
php也可以,它们可以是因为它们想兼容,想对用户友好, C语言不允许,
那是因为它严谨.人家留着有大用场.你ORACLE不允许使用双引号又是什么原由,说来听听.


   9. 别人的用户界面设计是\"没有消息就是最好的消息\", 或是\"无论发生什么,
都要让用户知道\",看看它在sqlplus下的变量:var i number;i:=5;print i;你什么看见什么, 什么都没有!你又能从这知道什么, 好消息?PS:我至今都不知道这说明了什么? i的值为NULL?, i不能在这下面赋值?不能赋值你说呀, 你不说我怎么知道不能赋值,虽然你很能有意见地显示了一个空行, 但是你还是要说呀, 你真的不能赋值吗? 你不是真的不能赋值吧?...




   后记: 好在我今天知道了要用SQL> exec :i := 5;SQL> print
:i但总不能让我掘地三尺才找得出来这些浅显的东西吧.


   10. 在sqlplus下help set看看, 找出一个叫set severout[put] on|off的选项注意,
它是severout,你在sqlplus下set severout on试试,SP2-0158: unknown SET option \"severout\" 了吧?set serverout on
是的, 就一个字母而已.



   编程大师说: 任何软件都有BUG.但,
一个如此小的BUG可以让一个全球第二大的软件公司带着它走过几个版本?Oracle8.15 Oracle8.16 Oracle8.17...难道保留错误是为了兼容性?后记:
我终于看到Oracle9i版里对此有了改进, 略感欣慰.



   11. PL/SQL的用户们, 看看下面:创建一个没带参数的procedure:create or replace procedure proc_name as
i number;begin...end proc_name;创建一个带参数的procedure:create or replace procedure proc_name(arg1,...) as i
number;begin...end proc_name;你很习惯用declare来声明吗? 不行, 这里不行, 你必需听我的, 用as创建一个触发器:create or replace
trigger tri_name before insert on tname for each row declare i
number; begin..end;因为这是触发器,所以它要用declare来声明变量,
尽管触发器用的也是PL/SQL的语法.但我们是为了区别于其它类型的存储过程,为了让用户觉得ORACLE高深莫测一点.怎么就一个end;不是endtri_name
吗?是的,procedure和function是这样设计的,但这样可以让用户觉得更难用一点么!(sqlplus下)你调用一个不带参数的procedure:callproc_name
();(sqlplus下)你调用一个不带参数的procedure:call proc_name(arg1, arg2);是的, 它不是可选的,
它必需如此,定义一个没有参数的procedure就是不要空的()号, 但调用它的时侯就是要,
定义一个有参数的procedure当然也要.function的情况与这个也一样.你调用一个function:ret_val := func_name();什么? 你不需要ret_val,
不行, 这是强买强卖, 不要不行. 否则我不干活!而且, 哼哼, 我给出的错误信息保证你看不懂.你要玩更高级的设计方法, 用上包了:create or
replace package pack_name as....end pack_name;是的, 这只是包的声明.要想定义这个包, 你还得:create or replace package body
pack_name as procedure proc_name is--你不是说用as吗? 是的, 但是这里as已经被上一条语句用了, 呶! 你也看到了. 用is有什么不好?
end proc_name function func_name is ... end func_name end pack_name;



   12. 看看出错信息, 来自SQLPLUS的, 来自Pro*C预编译器的, 来自其它工具如 imp, exp,
sqllda的.说不准你也别误导呀.



   13. 疲惫不堪的Pro*C程序员们: 在函数foo中你已经声明了EXEC SQL WHENEVER SQLERROR GOTO
sql_err;在另一个函数bar里你只想默默地使用EXEC SQL WHENEVER SQLERROR CONTINUE;但你没特别声明,
Pro*C的预编译器会告诉你,它在函数bar中找不到sql_err标号!!! 它可以跨函数使用标号.
它也敢自称是一个预处理器跟编译器沾沾边,刚才用陈桥五笔敲出来的处理器三个字恰好跟处理品是同样的键码, 我看叫处理品倒是名符其实.



   14. DDL语句的用户们:

www.sonicbbs.com

alter table tname add(col1 type...);alter table tname modify(col1 type...);alter table tname drop
column(col1);为何非要在drop里多出来一个column?



   15.命名
user_cons_columns; user_constraints; user_rollback_segs;  它真的要把segment统统缩
写为segs吗?把constraints缩写为cons?把columns缩写为cols?不,ORACLE的程序员们想怎么样就怎么样.他们是觉得单词的全称太长了吗?不见得,de
sc dba_users;看一下看看INITIAL_RSRC_CONSUMER_GROUP字段, 看看temporary_tablespace字段.再来看看一下create table:create table
tname (col1 type,...) storage(initial .. next ..minextents .. maxextents ..) ...;desc user_tables;inital_extent
next_extent minextents maxextents 不要问他们为什么有的用单数有的用复数, 因为他们是ORACLE.
他们想这样. dba_tables中owner dba_sequences中叫sequence_owneruser_tab_columns是关于一张表中列信息的, _tab_columns
user_cons_columns是关于表中字段的约束信息的, _cons_columns
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-5-16 23:17 , Processed in 0.296645 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表