接第一篇:
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
没有相关教程
|