zoukankan      html  css  js  c++  java
  • function

    一、概述
    1、函数与存储过程的不同点
    (1)、函数就是一个有返回值的过程,且是必须。
    (2)、存储过程只能作为一个plsql语句调用,而函数不但可以作为plsql语句调用,符合约束的函数还可以作为sql表达式的一部分使用。
    (3)、对于无参函数的定义和调用都没有圆括号,但无参存储过程需要。

    2、函数与存储过程的相同点
    (1)、都存储在数据库中,并且可在块中调用,代码都有定义部分、可执行部分、异常处理部分。
    (2)、都有in,out,in out三种参数,都可以使用缺省值,都可以通过out模式返回一个或多个值。
    (3)、都可以使用位置表示法和名称表示法。

    二.函数调用限制
    1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
    2、SQL只能调用带有输入参数,不能带有输出,输入输出函数
    3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
    4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句

    1.function函数的语法如下:

    create or replace function function_name (

    argu1 [mode1] datatype1, --定义参数变量

    argu2 [mode2] datatype2 --定义参数变量

    ) return datatype --定义返回的数据类型

    is

    begin

    end;

    执行 var v1 varchar2(100)
    exec :v1:=function_name

    2.不带任何参数的定义

    create or replace function get_user

    return varchar2

    is

    Result varchar2(50); --定义变量

    begin

    select username into Result from user_users;

    return(Result); --返回值

    end get_user;

    3.带有in参数的

    create or replace function get_sal(

    empname in varchar2

    ) return number

    is

    Result number;

    begin

    select sal into Result from emp where ename=empname;

    return(Result);

    end;

    执行: SQL> var sal number
    SQL> exec :sal:=get_sal('scott');

    4.带out参数的

    create or replace function get_info(

    e_name varchar2,

    job out varchar2

    ) return number

    Is

    Result number;

    begin

    select sal,job into Result,job from emp where ename=e_name;
    return(Result);
    end;

    执行: SQL> var job varchar2(20)
    SQL> var dname varchar2(20)
    SQL> exec :dname:=get_info('SCOTT',:job)

    5.带in out参数的

    6.函数调用举例

    create or replace function f_sys_getseqid(
    v_seqname IN VARCHAR2,
    v_provincecode IN VARCHAR2 --省编码
    ) return Varchar2
    IS
    iv_date VARCHAR2(8);
    iv_seqname VARCHAR2(50);
    iv_sqlstr VARCHAR2(200);
    iv_seq VARCHAR2(8);
    iv_seqid VARCHAR2(16);
    BEGIN
    iv_seqname := LOWER(TRIM(v_seqname));
    iv_sqlstr := 'SELECT '||iv_seqname||'.nextval FROM DUAL';
    EXECUTE IMMEDIATE iv_sqlstr INTO iv_seq;--执行动态的sql语句,执行相似的一组语句
    IF v_seqname = 'SEQ_FUNCROLE_ID' THEN
    iv_seqid:= 'ESS' || LPAD(iv_seq,5,'0');
    ELSE
    SELECT substrb(v_provincecode,1,2)||TO_CHAR(SYSDATE,'yymmdd') INTO iv_date FROM DUAL;
    iv_seqid:= iv_date || LPAD(iv_seq,8,'0');
    END IF;
    RETURN iv_seqid;
    EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;
    END;

    调用方式如下:

    SELECT TO_NUMBER(F_SYS_GETSEQID('SEQ_TERMTRADE_ID', V_PROVINCE_CODE)) INTO V_BATCH_ID FROM DUAL;

    EXECUTE IMMEDIATE的说明:执行动态的sql语句。

    7.in out
    create or replace function fun_info(i_eno number,o_title out varchar2,salch in out number) return varchar2
    as
    name emp.ename%type;
    begin
    select ename into name from emp where empno=i_eno;
    update emp set sal=sal+salch where empno=i_eno returning job,sal into o_title,salch;
    return name;
    end;

    调用
    declare
    v_eno number:=7369;
    vn emp.ename%type;
    vj emp.job%type;
    vs emp.sal%type;
    begin
    vs:=100;
    vn:=fun_info(v_eno,vj,vs);
    dbms_output.put_line('姓名' || vn || '岗位' || vj || '新工资' || vs);
    end;

    9.drop function
    drop function fun_info;

  • 相关阅读:
    房地产行业的商业智能BusinessIntelligence介绍
    企业混搭应用介绍
    ElasticSearch+NLog+Elmah实现Asp.Net分布式日志管理
    如何寻找“真爱”型合伙人
    微信转发朋友圈小视频就这么简单
    微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频
    微信养号教程预防封号
    首场微信小论坛上他们都聊了哪些小程序的议题
    搜狗微信搜索增加平均阅读数和发文数
    微信小程序想要的是无法监测的流量dark social
  • 原文地址:https://www.cnblogs.com/c0liu/p/5487949.html
Copyright © 2011-2022 走看看