接第一篇:
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