//
日期格式化:
to_date('2006-11-20 16:35:00','yyyy-mm-dd hh24:mi:ss')
//
取子串,第二個參數表示從原串的何處起取,第三個參數指子串長度:
substr('abcdef',1,4)
substr('ab',1,4)= 'ab'
//
日期截取,即截取時間,保留時間部分:
trunc(sysdate)
//
日期的加減:
trunc(sysdate)-1?
前一天
trunc(sysdate)-1/(24*60*60)?
前一秒
to_number(trunc(sysdate)-begintime)*1440?
計算時間差,單位:分鐘
//
四舍五入:
round(2.555)=2
round(2.555,2)=2.56
//case
語句:
case when sysdate>MyTable.cleartime
then
……
else
……
end
case MyTable.objid when 'hmy'
then
……
else
……
end
//decode
函數,類似于三元運算符:
decode(MyTable.price,null,0, MyTable.price)?
如果
price
為
null
,返回
0
具體的語法格式如下:
DECODE(input_value,value,result[,value,result…][,default_result]);
//
常見的比率計算示例:
Select to_char(round(sum(decode(isactive,0,1,0))/count(isactive)*100,2))||'%' from
……
//
在字符串類型數據判等時,如果是
char
或
nchar
,注意多余的空格
//
判斷交集:
如何判斷兩個時間段有交集,
starttime_1= = =endtime_1
,
starttime_2= = =endtime_2
where least(endtime_1, endtime_2) >greatest(starttime_1, starttime_2)
//
打印輸出
dbms_output.put_line('
……
');
//
存儲過程:
(1)
從最簡單的存儲過程例子開始:
create or replace procedure MyProc
as
begin
? delete from MyTable;
end;
// oracle
中可以使用
replace
,方便多了。
as
亦可用
is
。
(2)
帶上參數:
create or replace procedure MyProc(p_date in date)
as
begin
? delete from MyTable where starttime= p_date;
end;
//in
可省去,如有輸出參數,應用
out.
(3)
聲明變量:
create or replace procedure MyProc
as
v_count number:=0;
begin
select count(*) into v_count from MyTable;
if v_count>0 then
……
;
end if;
end;
//
變量聲明不用
declare
。變量可以指定默認值。
(
“
PL/SQL
程序”又稱“
PL/SQL
塊”,“
PL/SQL
塊”分為過程,函數,觸發器等,“
PL/SQL
塊”又分為“帶名塊”和“匿名塊”。“帶名塊”就是有名字的程序,如上面存儲過程“
MyProc
”,“匿名塊”就是沒有名字的程序,“帶名塊”里面以
is/as
開始定義變量,“匿名塊”里面以
declare
開始來定義變量
)
(4)
聲明游標:
create or replace procedure MyProc
as
cursor cursor_1 is
select objid,starttime from MyTable;
c1_row cursor_1%ROWTYPE;
c1_objid MyTable.objid%TYPE;
c1_starttime MyTable.starttime%TYPE;
begin
? open cursor_1;
fetch cursor_1 into c1_objid,c1_starttime;
loop
fetch cursor_1 into c1_row;
exit when cursor_ 1%notfound;
? if c1_row.starttime< c1_starttime then
???
……
? end if;
end loop;
close cursor_1
end;
//
使用
%TYPE
可以省去查看列的數據類型的麻煩
//
可以使用
%ROWTYPE
來在游標中表示一行記錄。
//
游標中常用的屬性:
%notfound
、
%found
(5)
動態游標:
create or replace procedure MyProc
as
v_id varchar2(20);
type v_cursor is ref cursor;
cursor_1 v_cursor;
c1_objid MyTable.objid%TYPE;
c1_starttime MyTable.starttime%TYPE;
begin
? v_id:=
……
;
? open cursor_1 for 'select objid,starttime from MyTable where objid=''' || v_id || '''';
……
close cursor_1;
end;
//
游標的語句可以動態指定
//
調試存儲過程
不同數據庫中對存儲過程的調試都是個令人頭痛的問題,
oracle
中如欲調試存儲過程,最好有輔助軟件,如
pl/sql developer
。在
pl/sql developer
可按以下步驟對存儲過程進行調試:
一、定位你的
procedure
1
在屏幕左邊的對象瀏覽器中展開
procedure
2
找到你的
procedure
二、打開測試窗口
1
在你的
procedure
上點擊右鍵
2
在彈出的菜單中選擇
test
3PL/SQL Devoloper
就會打開一個測試窗口并自動生成一個調用塊
4
在測試窗口的下方輸入你的
procedure
的入口參數
三、打開編輯窗口
1
在你的
procedure
上點擊右鍵
2
在彈出的菜單中選擇
edit
3PL/SQL Devoloper
就會打開編輯窗口
4
在需要的地方設置斷點
四、開始調試
1
回到調試窗口
2
打開
debug
菜單,你就會看見
start
項已經可以用了,點擊它
3
接下來就可以用調試窗口上的按鈕進行單步跟蹤
如果在調試過程中提示“
no debug information
”,則右鍵相應的存儲過程,選中“
add debug information
”。
//
設置定時任務
variable n number;
begin
dbms_job.submit(:n,'MyProc;',sysdate,'sysdate+1/1440');
commit;
end;
//
定時執行
MyProc
存儲過程,第隔一分鐘執行一次。變量
n
用于返回該任務在系統中的編號
(
唯一標識
)
,你可以用語句將它打印出來。
//
如果存儲過程有參數,則第二個參數改作類似:
'MyProc(10);'
即可。
(
使用
Submit()
過程,工作被正常地計劃好。
這個過程有五個參數:
job
、
what
、
next_date
、
interval
與
no_parse
。
PROCEDURE Submit ( job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
job
參數是由
Submit()
過程返回的
binary_ineger
。這個值用來唯一標識一個工作。
what
參數是將被執行的
PL/SQL
代碼塊。
next_date
參數指識何時將運行這個工作。
interval
參數何時這個工作將被重執行。
no_parse
參數指示此工作在提交時或執行時是否應進行語法分析
——TRUE
指示此
PL/SQL
代碼在它第一次執行時應進行語法分析,
而
FALSE
指示本
PL/SQL
代碼應立即進行語法分析
)
begin
dbms_job.remove(21);
end;
//
移除指定編號的任務
begin
dbms_job.run(21);
end;
//
手動執行一次指定編號的任務
select job,next_date,next_sec,failures,broken from user_jobs;
//
獲取系統中所有的任務信息
http://www.cnblogs.com/KissKnife/services/trackbacks/602140.aspx