zoukankan      html  css  js  c++  java
  • oracle 自定义函数

    函数和存储过程类似,可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用。与存储过程不同的是,函数总是向调用者返回一个值,而存储过程不能有返回值。

    CREATE [OR REPLACE] FUNCTION function_name
    
    [(argment [ { IN| IN OUT }] type,
    
     argment [ { IN | OUT | IN OUT } ] type]
    
    RETURN return_type  
    
    { IS | AS }
    
    <类型.变量的说明> 
    
    BEGIN
    
    FUNCTION_body
    
    EXCEPTION
    
    异常处理语句
    
    END;
    
    --IN:输入参数,向存储过程传递值,默认类型,可以不写
    
    --OUT:输出参数,用于返回结果。
    
    --IN OUT:作为IN参数向存储过程传递值,同时作为OUT参数返回值。
    
    --REPLACE:指明若已有同名的存储过程存在,那么将被替换成当前创建的版本。
    
    --RETURN只能返回单个值,不能返回多个值。
    
    --可以使用DEFAULT关键字为输入参数指定默认值。
    --没有参数的函数
    create or replace function get_user return varchar2 is
      v_user varchar2(50);
    begin
      select username into v_user from user_users;
      return v_user;
    end get_user;
    
    --测试
    方法一
    select get_user from dual;
    
    方法二
    SQL> var v_name varchar2(50)
    SQL> exec :v_name:=get_user;
    
    PL/SQL 过程已成功完成。
    
    SQL> print v_name
    
    V_NAME
    ------------------------------
    TEST
    
    方法三
    SQL> exec dbms_output.put_line('当前数据库用户是:'||get_user);
    当前数据库用户是:TEST
    
    PL/SQL 过程已成功完成
    --带有IN参数的函数
    create or replace function get_empname(v_id in number) return varchar2 as
      v_name varchar2(50);
    begin
      select name into v_name from employee where id = v_id;
       return v_name;
    exception
      when no_data_found then
        raise_application_error(-20001, '你输入的ID无效!');
    end get_empname;

    函数的调用:

    把函数作为PL/SQL中的表达式调用

    例如:假如函数getID()可以返回值,可以这样调用:SELECT * FROM table WHERE id=getID()

    创建一个变量用于接收函数的返回值

     

           例如:VARIABLE id NUMBER;

                    EXECUTE :id  := getID();

                    PRINT(id);

    调用函数的位置:

    l         SELECT 语句的列表部分,eg: SELECT fun(..)….

    l         WHERE HAVING 字句 eg:WHERE id=fun(…)…

    l         ORDER BY CONNECT BYSTART WITHGROUP BY 字句

    l         INSERT 语句的VALUES部分 INSERT INTO  table VALUES(..,fun(),..)

    l         UPDATE 语句的SET部分 eg:UPDATE table SET name=fun(…)

    l         PL/SQL

    要让函数可以在SQL表达式中调用,必须满足以下条件:

        1.  应该是stored function

         2.  只接收IN参数

        3. 传入参数和返回值都必须是SQL支持的类型,不能是PL/SQL中的特殊类型(例如boolean

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

  • 相关阅读:
    vs2013 在win7下,使用c++创建项目各种报错问题解决方案
    排序含有数字的字符串:一个巧妙地方法
    wpf 控件大小随窗体大小改变而改变
    WPF TreeView 选择事件执行两次,获取TreeView的父节点的解决方法
    最近几年的编程感悟(3)完结
    mysql Packet for query is too large (2036 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
    java BigDecimal加减乘除 与 保留两位小数
    java 字符串的运算公式直接转计算结果
    ecplise tomcat忽然出现404
    float 、double 加减乘除出现小数位多出的问题
  • 原文地址:https://www.cnblogs.com/wakey/p/4501707.html
Copyright © 2011-2022 走看看