oracleI定义常用函数

1 函数的创建、调用和权限

1.1 创建函数

复制代码
create or replace function 函数名(参数1 模式 数据类型,......) return 数据类型
as
  -- 定义局部变量。
  变量1 数据类型;
  ......
begin
  -- 实现函数功能的PL/SQL代码。
  ......
  exception
  -- 异常处理的PL/SQL代码。
  ......
end;
复制代码

说明:

1)参数的模式有三种:

in:只读模式,在函数中,参数只能被引用/读取,不能改变它的值;

out:只写模式,参数只能被赋值,不能被引用/读取;

in out:可读可写。

注:参数的模式可以不写,缺省为inoutin out两种模式极少使用。

2)as/is二选一,在这里没有区别;

3)可以不定义局部变量;

4)可以没有异常(exception)处理代码段;

复制代码
--示例,创建自定义函数maxvalue,用于比较两个数字的大小,返回较大值;
create or replace function maxvalue(val1 number,val2 number) return number
as
  val number;   -- 定义局部变量,存放返回值。
begin
  if (val1>val2) then    -- 判断传入参数的大小。
      val:=val1;         -- 赋值是":=",不是"="。
  else
      val:=val2;
  end if;

  return val;  -- 返回
end;
复制代码

1.2 函数的调用

自定义函数的调用与Oracle数据库自带的函数调用的方法相同。

select maxvalue(10, 20) from dual;

1.3 函数的权限

自定义函数是数据库对象,oracle对它权限管理方式与其他数据库对象相同;

如果maxvalue函数是用户scott用户创建的,其他用户调用时需要加scott用户名前缀,并且具备相应的权限,否则会出现“ORA-00904:"MAXVALUE": 标识符无效”的错误;

1.4 删除自定义函数

drop function 函数名;
--eg:
drop function maxvalue;

2 MD5加密函数

create or replace function md5(passwd in varchar2) return varchar2 is
  retval varchar2(32);
begin
  retval := utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string => passwd));
  return retval;
end;

:复制该语句,直接在plsql的SQL窗口中执行即可完成创建;

使用:

select lower(用户.md5('1234')) as 密文 from dual;

3 获取汉字首字母拼音的函数

复制代码
create or replace function fgetpy(v_str varchar2) return varchar2 as
  v_strlen int;
  v_return varchar2(500);
  v_ii     int;
  v_n      int;
  v_c      varchar2(2);
  v_chn    varchar2(2);
  v_rc     varchar2(500);
  /************************************************************************* 
  生成汉字拼音码的函数。 2009-06-21  
  **************************************************************************/
begin
  --dbms_output.put_line(v_str); 
  v_rc     := v_str;
  v_strlen := length(v_rc);
  v_return := '';
  v_ii     := 0;
  while v_ii < v_strlen loop
    v_ii := v_ii + 1;
    v_n  := 63;
    select substr(v_rc, v_ii, 1) into v_chn from dual;
    select v_n + max(rowsf)
      into v_n
      from (select chn, rownum rowsf
              from (select chn
                      from (select '' chn
                              from dual
                            union
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual --because have no 'i' 
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select ''
                              from dual
                            union all
                            select v_chn
                              from dual) a
                     order by nlssort(chn, 'NLS_SORT=SCHINESE_PINYIN_M')) c) b
     where chn = v_chn;
    v_c := chr(v_n);
    if chr(v_n) = '@' then
      --英文直接返回 
      v_c := v_chn;
    end if;
    v_return := v_return || v_c;
    v_return := lower(v_return);
  end loop;
  return v_return;
end fgetpy;
复制代码

:复制该语句,直接在plsql的SQL窗口中执行即可完成创建;

使用:

select fgetpy('张三,李四,ww') from dual;

 

原文链接:https://blog.csdn.net/lling_shan/article/details/106052458

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道

posted @   DAYTOY-105  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示

目录导航