【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基础语法-学习笔记】

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