存储过程和自定义函数

在做项目的计费功能的时候,

首先需要在数据库里定义 一条费率规则,规则下包括若干个条件

在做到了查费率这一步的时候犯了难,要把商品的  若干个属性 都写到sql里查?这样写起来可就麻烦了

于是经理大笔一挥写了个存储过程,告诉我,你把属性拼成一个json串传进来就能查到费率了,看得我目瞪狗呆。。。

回来赶紧补课,看看存储过程是个什么玩意?、

书上写的:

存储过程是由过程化SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可

优点:

1运行效率高

2降低了客户机和服务器之间的通信量

3方便实施企业规则


存储过程的用户接口:

创建存储过程:

 //存储过程首部

as <CREATE OR REPLACE PROCEDURE 过程名 ([参数1,参数2,...])   过程化SQL串>              //存储过程体


执行存储过程:

CALL/PERFORM 存储过程名([参数1,参数2...])


修改存储过程:

改名字

ALTER PROCEDURE 过程名1   RENAME TO   过程名2;


可以使用ALTER PROCEDURE重新编译一个存储过程:


ALTER PROCEDURE 过程名 COMPILE


删除存储过程:

DROP PROCEDURE 过程名();


好了,现在去toad里看看存储过程长什么样,

CREATE OR REPLACE FUNCTION WHG_YMS."F_GETSEQNO" ( keyValue varchar2 ) RETURN NUMBER
等等,这是个什么东西,function ,功能?

没错,它叫自定义函数,那它跟存储过程有什么关系 呢?

自定义函数与存储过程相似,都是持久性存储模块。函数的定义和存储过程也类似,不同之处是函数必须指定返回的类型

自定义函数的定义:

CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,...])   RETURNS <类型> 

AS <过程化SQL块> 

自定义函数的执行语句格式

CALL/SELECT 函数名([参数1,参数2...])


修改自定义函数

改名字

ALTER FUNCTION 过程名1   RENAME TO   过程名2;


可以使用ALTER FUNCTION重新编译一个存储过程:


ALTER PROCEDURE 函数名 COMPILE


现在给一个自定义函数的简单案例(从同事那里抄过来的,学习吗,都是从抄开始的):


CREATE OR REPLACE FUNCTION  "F_GETSEQNO"  ( keyValue varchar2 )  RETURN NUMBER  //创建一个生成流水号的函数,返回值是数字
 IS
tmpVar NUMBER;
ls_keyValue  VARCHAR2(100);
ll_currentValue  number;
ll_rowCount   number;
ll_step   number;
returnValue   number;

//定义了若干变量


 PRAGMA AUTONOMOUS_TRANSACTION;

//这段代码的是自治事务?上网查了一下,自治事务的特点是不依赖于原有MAIN程序,比如MAIN程序中有未提交的数据,那么在自制事务中是查找不到的

在自治事务中,COMMIT或者rollback只会提交或回滚当前自治事务的DML,不会影响MAIN程序中的MDL。然而还是不太懂。。。


/******************************************************************************
   NAME:       F_GETSEQNO
   PURPOSE:    


   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2017/9/7   scown       1. Created this function.


   NOTES:
******************************************************************************/
BEGIN

//这东西好像是toad编辑器生成的注释,好厉害的样子


ls_keyValue := upper(keyValue);
//把传过来的keyValue 全部换成大写,赋值

----10.取得当前值
    SELECT COUNT (1)
      INTO ll_rowCount
      FROM SYS_SQLSEQUENCES
     WHERE keyValue = ls_keyValue;

//还有select into 这种用法,长姿势了     

//查出来的数字 赋值



    if ll_rowCount > 0  then 
        --检索当前值

        select CURRENTVAL,step
          into ll_currentValue,ll_step  
          from SYS_SQLSEQUENCES
         where KEYVALUE = ls_keyValue;
    else
        --插入新的序列
        INSERT INTO SYS_SQLSEQUENCES (ID, KEYVALUE, STARTWITH, CURRENTVAL,STEP, MINVALUE, MAXVALUE)
              VALUES (sys_guid(),ls_keyValue, 1, 1,1, 1, 99999999999999);
        ll_currentValue := 0;
        ll_step := 1 ;
    end if;

//如果>0执行什么,否则执行什么


----30.得到新值并跟新数据
    returnValue := ll_currentValue + ll_step;
    
    update SYS_SQLSEQUENCES 
       set CURRENTVAL = returnValue
     where KEYVALUE = ls_keyValue;
    commit;
    return returnValue;


//最后执行什么


   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END F_GETSEQNO;


//异常的情况执行什么





修改存储过程:

改名字

ALTER PROCEDURE 过程名1   RENAME TO   过程名2;


可以使用ALTER PROCEDURE重新编译一个存储过程:


ALTER PROCEDURE 过程名 COMPILE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值