【oracle函數】-實戰開發及擴展

【函數的由來】
**確定實現目標:**返回一個數值;

爲什麼要返回一個數值?
由於針對不同的保險產品,在規則平臺中有不同的校驗角度,爲了在特殊情況下,不用再次對核心系統以及規則平臺做調整,即通過增加“特殊字段”來解決這個問題。

然後就在代碼裏有了它,隨便定義一個函數名字~

select (FNC_TS_SPECIALSUM('8828012000406608', '7213', 'TS')) as specialSum from dual;

【函數學習開始啦】
成果是它,照着寫的,也沒整太明白,反正能用!能看懂!留着以後鑽研。

CREATE OR REPLACE FUNCTION FNC_TS_SPECIALSUM(mcontno in ywbiao.contno%type,
                                       mriskcode in pzbiao.riskcode%type,
                                       mtype in char )
  RETURN  ywbiao.Amnt%TYPE IS
  tspecialSum ywbiao.Amnt%TYPE;--默認值0
  t_specialSum  ywbiao.Amnt%TYPE ; --獲取值
  t_sql sfbiao.calsql%TYPE ;
  t_calsql sfbiao.calsql%TYPE ;
  t_temp NUMBER; --控制遊標
  t_count NUMBER;
  t_cursor NUMBER;


begin
  tspecialSum := 0 ;
  t_count := 0 ;
  t_specialSum := 0 ;
  t_sql := '' ;

  --查看險種下面是否有特殊校驗算法
  select count(*) into t_count from  sfbiao
  where type = mtype  and riskcode=mriskcode;
IF t_count > 0 THEN
   --獲取算法 
    select calsql into t_calsql  from  sfbiao a  where a.type = mtype  and a.riskcode=mriskcode;
    t_cursor := DBMS_SQL.OPEN_CURSOR;
  --取出一條SQL DBMS_OUTPUT.PUT_LINE(trim(substr(t_CalSQL.calsql,0,255)));
        --將SQL中的"?contno?"替換成有效的投保單號
       t_sql := REPLACE(trim(t_calsql),'?contno?',mcontno) ;
       DBMS_OUTPUT.PUT_LINE(t_sql);
       DBMS_SQL.PARSE(t_cursor, t_sql, DBMS_SQL.native);
       --將結果第一列綁定到變量t_specialSum上
       DBMS_SQL.DEFINE_COLUMN(t_cursor,1,t_specialSum);
       --執行該條SQL語句
       t_temp := DBMS_SQL.EXECUTE(t_cursor);
       --針對結果集進行取數到 t_specialSum,在進行計算
         IF DBMS_SQL.FETCH_ROWS(t_cursor)>0 THEN
           DBMS_SQL.COLUMN_VALUE(t_cursor,1,t_specialSum);
         END IF;
   DBMS_SQL.CLOSE_CURSOR(t_cursor);
ELSE
  --沒有配置算法默認爲0
  tspecialSum := 0 ;
END IF ;
  DBMS_OUTPUT.PUT_LINE(' 特殊累計取值:'||t_specialSum);
  return(t_specialSum);

END FNC_TS_SPECIALSUM;
/

【函數必須要看懂的點-擴展】
return ywbiao.Amnt%TYPE ,返回表定義的類型;
t_cursor NUMBER,計數器;
t_cursor := DBMS_SQL.OPEN_CURSOR;Oracle遊標工具
t_sql := REPLACE(trim(t_CalSQL.calsql),’?InsuredNo?’,tkehuNo),替換;
DBMS_SQL.PARSE(t_cursor, t_sql, DBMS_SQL.native),解析,將t_sql計算出來的值賦給t_cursor;
DBMS_SQL.DEFINE_COLUMN(t_cursor,1,t_temp_SumAmnt),賦值,將t_cursor中的第一個值,賦給t_temp_SumAmnt;
DBMS_SQL.CLOSE_CURSOR(t_cursor),關閉遊標;

PARSE:解析要執行的語句
BIND_VARIABLE:將給定的數量與特定的變量相連接
DEFINE_COLOUMN:定義字段變量,其值對應於指定遊標中某個位置元素的值(僅用於select語句)
EXECUTE:執行指定的遊標
EXECUTE_AND_FETCH:執行指定的遊標並取記錄
FETCH_ROWS:從指定遊標中取出記錄
COLUMN_VALUE:返回遊標中指定位置的元素
IS_OPEN:當指定的遊標狀態爲OPEN時返回真值
CLOSE_CURSOR:關閉指定的遊標並釋放內存
LAST_ERROR_POSITION:返回出錯sql語句的字節偏移量
LAST_ROW_ID:返回最後一條記錄的rowid
LAST_SQL_FUNCTION_CODE:返回語句的sql function code

t_cursor := DBMS_SQL.OPEN_CURSOR;–返回新遊標ID值
dbms_sql.parse(V_cur,SQL_string,DBMS_SQL.NATIVE);–解析並執行SQL語句
語法,PRAGMA RESTRICT_REFERENCES(function_name | default , )RNDS, WNDS, RNPS, WNPS) | , TRUST);
RNDS,WNDS,RNPS,WNPS可以同時指定。但當TRUST指定是,其它的被忽略。
DEFAUT是指作用在該程序包上的所有子程序,函數。
RNDS(Read No Database State),規定子程序不能讀取任何的數據庫狀態信息。(即不會查詢數據庫的任何表,包括DUAL虛表)
RNPS(Read No Package State),規定子程序不能讀取任何程序包的狀態信息,如變量等。
WNDS(Write No Database State),規定子程序不能向數據庫寫入任何信息。(即不能修改數據庫表)
WNPS(Write No Package State),規定子程序不能向程序包寫入任何信息。(即不能修改程序包變量的值)
TRUST,指出子程序是可以相信的不會違反一個或多個規則。這個選項是需要的當用C或JAVA寫的函數通過PL/SQL調用時,因爲PL/SQL在運行是對它們不能檢查。

【oracle全面語法-擴展附件】
【oracle基礎語法-學習筆記】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章