【函數的由來】
**確定實現目標:**返回一個數值;
爲什麼要返回一個數值?
由於針對不同的保險產品,在規則平臺中有不同的校驗角度,爲了在特殊情況下,不用再次對核心系統以及規則平臺做調整,即通過增加“特殊字段”來解決這個問題。
然後就在代碼裏有了它,隨便定義一個函數名字~
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基礎語法-學習筆記】