科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道oracle的毛病!!

oracle的毛病!!

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  本文纯为牢骚, 怨言。

作者:中国IT实验室 来源:中国IT实验室 2007年10月5日

关键字: 数据库 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...难道保留错误是为了兼容性?
    
  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;不是end tri_name吗? 是的, procedure和function是这样
    设计的, 但这样可以让用户觉得更难用一点么!
    
    (sqlplus下)你调用一个不带参数的procedure:
    call proc_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语句的用户们:
    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的程序员们想怎么样就怎么样. 他们是觉得
    单词的全称太长了吗? 不见得, desc 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_owner
    user_tab_columns是关于一张表中列信息的, _tab_columns
    user_cons_columns是关于表中字段的约束信息的, _cons_columns
  
  
  后记: 我终于看到Oracle9i版里对此有了改进, 略感欣慰.
  

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章