存儲過程的常用用法

最近在用存儲過程,在網上找了很多的資料,下面就參考各種資料整理的一些小例子做些闡述:
1. Oralce TO_NUMBER() function 的改進:
用Oracle TO_NUMBER進行類型轉換的時候,如果有無效數字,將返回錯誤。遺憾的是,Oralce TO_NUMBER並不是在query運行開始就報錯,而是到碰到無效數字的紀錄才報錯,而且只是說無效輸入,並不提示是哪條紀錄,也沒有任何輸出。如果是一張大表,query運行很久纔來這麼一下,而且根本不知道那裏出的錯,是什麼值,豈不痛苦?偶就經常跟這樣的表打交道,遂自建一個函數,GET_NUM:

CREATE OR REPLACE FUNCTION GET_NUM(IN_TXT in VARCHAR2) RETURN NUMBER IS
RETRUN_VALUE NUMBER;
BEGIN
 select to_number(IN_TXT) into RETRUN_VALUE from dual;
 RETURN RETRUN_VALUE;
 
 EXCEPTION
 WHEN others
 THEN
 RETURN null;
END GET_NUM;
/
這樣無效數字全轉換成 Null,糾錯容易多了。

寫個存儲過程測試一下:
CREATE OR REPLACE PROCEDURE TestFun IS
    v_name varchar2(10);/***** 存放cursor_para中的name *****/
    CURSOR cursor_name IS select name from test;
    cursor cursor_para(p_num number) is select name from test where num = p_num;
begin
  /******* t_name爲循環的臨時變量******/
  FOR t_name IN cursor_name LOOP
 
    if (get_num(t_name.name) is not null) then
    
   open cursor_para(get_num(t_name.name));
   
   fetch cursor_para into v_name;
   
   DBMS_OUTPUT.PUT_LINE('Name:'|| v_name);
   
   close cursor_para;
       
   end if;
  
  END LOOP;
END TestFun;
/
存儲過程也用到了帶參數的遊標和遊標For循環,稍後介紹.

其中測試表的創建:
create table test
(
     name varchar2(10),
    num number
)

測試數據:
insert into test(name) values ('12_');
insert into test(name) values ('123');

2.帶參數的遊標

  與存儲過程和函數相似,可以將參數傳遞給遊標並在查詢中使用。這對於處理在某種條件下打開遊標的情況非常有用。它的語法如下:

CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

  定義參數的語法如下:

Parameter_name [IN] data_type[{:=|DEFAULT} value]

  與存儲過程不同的是,遊標只能接受傳遞的值,而不能返回值。參數只定義數據類型,沒有大小。

  另外可以給參數設定一個缺省值,當沒有參數值傳遞給遊標時,就使用缺省值。遊標中定義的參數只是一個佔位符,在別處引用該參數不

一定可靠。

  在打開遊標時給參數賦值,語法如下:

OPEN cursor_name[value[,value]....];

3.遊標FOR循環

  在大多數時候我們在設計程序的時候都遵循下面的步驟:

  1、打開遊標

  2、開始循環

  3、從遊標中取值

  4、檢查那一行被返回

  5、處理

  6、關閉循環

  7、關閉遊標

  可以簡單的把這一類代碼稱爲遊標用於循環。但還有一種循環與這種類型不相同,這就是FOR循環,用於FOR循環的遊標按照正常的聲明方

式聲明,它的優點在於不需要顯式的打開、關閉、取數據,測試數據的存在、定義存放數據的變量等等。遊標FOR 循環的語法如下:

FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;

上面的這兩個用法也在例子中提到了!

同理類推,也可以將TO_DATE()函數改進。

下面的例子自http://www.nikicn.com/bbs/dispbbs.asp?boardid=23&id=908
沒有測試,留作備份之用:
4. 將Oracle 的Last_Day()函數改寫到DB2上:
DROP SPECIFIC FUNCTION LAST_DAYDATE
;
CREATE FUNCTION LAST_DAY(D DATE)
RETURNS     DATE
    SPECIFIC LAST_DAYDATE
    LANGUAGE SQL
    DETERMINISTIC
    CONTAINS SQL
    CALLED ON NULL INPUT
    NO EXTERNAL ACTION
    RETURN
D + 1 month - day(D + 1 month) day

;

同理,DB2下的first day:
DROP SPECIFIC FUNCTION FIRST_DAYDATE
;
CREATE FUNCTION FIRST_DAY(D DATE)
RETURNS     DATE
    SPECIFIC FIRST_DAYDATE
    LANGUAGE SQL
    DETERMINISTIC
    CONTAINS SQL
    CALLED ON NULL INPUT
    NO EXTERNAL ACTION
    RETURN
D - day(D) day + 1 day

 
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章