`
shihuan830619
  • 浏览: 580093 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle的几个Function实例

阅读更多
create or replace function str_list2( key_name in varchar2,
                    key  in varchar2,
                    coname in varchar2,
                    tname     in varchar2 )
return varchar2
as
    type rc is ref cursor;
    str    varchar2(4000);
    sep    varchar2(2);
    val    varchar2(4000);
    cur    rc;
begin
    open cur for 'select '||coname||'
                    from '|| tname || '
                    where ' || key_name || ' = '
                using key;
    loop
        fetch cur into val;
        exit when cur%notfound;
        str := str || sep || val;
        sep := ', ';
    end loop;
    close cur;
    return str;
end;



--------------------------------------------------------------------------------------------------

create or replace function ip_int2string(intip number) return varchar2 is
    /**
     * added by ty
     * IP段整型格式转换为字符串格式
     *
     * 计算结果必须与com.zznode.inms.ipms.util.AlgorithmToolKit中的
     * public static String getStringIp(int intIp)方法的计算结果一致
     */
  Result varchar2(15);
  min_int number;
  temp number;
  temp1 number;
  temp2 number;
  temp3 number;
  temp4 number;
  flag number;
 
begin
  min_int:=-2147483648;
  if intip<min_int or intip>2147483647 then
     raise_application_error(-20020,'[IPMS] Illegal int IP!');
  end if;
 
  if intip<0 then
     temp:=intip-min_int;
     flag:=0;
  else
     temp:=intip;
     flag:=1;
  end if;
 
  temp1:= bitand(floor(temp/(2**24)),255);--右移24位,进行与运算
  temp2:= bitand(floor(temp/(2**16)),255);--右移16位,进行与运算
  temp3:= bitand(floor(temp/(2**8)),255);--右移8位,进行与运算
  temp4:= bitand(temp,255);--进行与运算
 
  if flag=1 then
     temp1:=temp1+128;
  end if;
 
  Result:=temp1||'.'||temp2||'.'||temp3||'.'||temp4;
  dbms_output.put_line(Result);
  return(Result);
 
  exception
      when others then
       raise_application_error(-20020,'[IPMS] Illegal int IP!');
      
end ip_int2string;

--------------------------------------------------------------------------------------------------

create or replace function ip_string2int(stringip varchar2) return number is
    /**
     * added by ty
     * IP段字符串格式转换为整型格式
    * 要求一个地址大于(或小于)另一个地址时,整型格式也保持大于(或小于)关系
    * 如:128.0.0.0 > 127.255.255.255,要求ip_string2int(128.0.0.0)>ip_string2int(127.255.255.255)
     *
     * 计算结果必须与com.zznode.inms.ipms.util.AlgorithmToolKit中的
     * public static int getIntIp(String stringIp)方法的计算结果一致
     */
  Result number;
  min_int number;
  ip1 number;
  ip2 number;
  ip3 number;
  ip4 number;

  pos1 number;
  pos2 number;
  pos3 number;
 
  temp1 raw(32);
  temp2 raw(32);
  temp3 raw(32);
  temp4 raw(32);
  temp number;
  flag number;
begin
  min_int:=-2147483648;
  Result:=0;
  pos1:=instr(stringip,'.',1,1);
  pos2:=instr(stringip,'.',1,2);
  pos3:=instr(stringip,'.',1,3);
  if pos1=0 or pos2=0 or pos3=0 then
       raise_application_error(-20020,'Illegal IP format!');
  else
       ip1:=to_number(substr(stringip,1,pos1-1));
       ip2:=to_number(substr(stringip,pos1+1,pos2-pos1));
       ip3:=to_number(substr(stringip,pos2+1,pos3-pos2));
       ip4:=to_number(substr(stringip,pos3+1,length(stringip)-pos3));
       if ip1<0 or ip1>255 or ip2<0 or ip2>255 or ip3<0 or ip3>255 or ip4<0 or ip4>255 then
          raise_application_error(-20020,'[IPMS] Illegal IP format!');
       end if;
      
       ip2:=ip2*(2**16);--左移16位
       ip3:=ip3*(2**8);--左移8位
             
       if ip1>127 then
          ip1:=ip1*(2**24)+min_int;--左移24位
          flag:=1;
       else
            ip1:=ip1*(2**24);--左移24位
            flag:=0;
       end if;
        
       temp1:= utl_raw.cast_from_binary_integer(ip1);
       temp2:= utl_raw.cast_from_binary_integer(ip2);
       temp3:= utl_raw.cast_from_binary_integer(ip3);
       temp4:= utl_raw.cast_from_binary_integer(ip4);
       --或运算
       temp:= utl_raw.cast_to_binary_integer(utl_raw.bit_or(utl_raw.bit_or(utl_raw.bit_or(temp1,temp2),temp3),temp4));
      
       if flag=1 then
           Result:= temp;
       elsif flag=0 then
           Result:= temp+min_int;
       end if;

  end if;
  dbms_output.put_line(Result);
  return(Result);
 
  exception
      when others then
       raise_application_error(-20020,'[IPMS] Illegal IP format!');
 
end ip_string2int;

--------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION get_short_name(
   init_name VARCHAR2
)
RETURN VARCHAR2
   IS
   short_name   VARCHAR2(1000);
BEGIN
   short_name := init_name;
   IF INSTR(short_name,'TenGigabitEthernet') >0 THEN
      short_name := REPLACE(short_name,'TenGigabitEthernet','TGE');
   END IF;

      IF INSTR(short_name,'TenGigE') >0 THEN
      short_name := REPLACE(short_name,'TenGigE','TGE');
   END IF;

      IF INSTR(short_name,'FastEthernet') >0 THEN
      short_name := REPLACE(short_name,'FastEthernet','FE');
   END IF;

      IF INSTR(short_name,'port-fei') >0 THEN
      short_name := REPLACE(short_name,'port-fei','"FE');
   END IF;

      IF INSTR(short_name,'GigabitEthernet') >0 THEN
      short_name := REPLACE(short_name,'GigabitEthernet','GE');
   END IF;

      IF INSTR(short_name,'Gig Ethernet') >0 THEN
      short_name := REPLACE(short_name,'Gig Ethernet','GE');
   END IF;

      IF INSTR(short_name,'Gigabit-ethernet') >0 THEN
      short_name := REPLACE(short_name,'Gigabit-ethernet','GE');
   END IF;

         IF INSTR(short_name,'GigaEthernet') >0 THEN
      short_name := REPLACE(short_name,'GigaEthernet','GE');
   END IF;

         IF INSTR(short_name,'port-gei') >0 THEN
      short_name := REPLACE(short_name,'port-gei','GE');
   END IF;

   RETURN short_name;
END    get_short_name;

--------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION F_TEMPLETEID_TO_DEVCOLLECT (P_TEMPLETEID IN NUMBER) RETURN VARCHAR2 IS
     V_DEVNAME_LIST VARCHAR2(4000);
     STR VARCHAR2 (3)   DEFAULT NULL;
     str_length  number;
     CURSOR CUR IS SELECT C.DEVICENAME
  FROM RPT_USER_TEMPLET A, RPT_TEMPLET_OBJECT B, MR_DEVINFO_DIM C
  WHERE A.ID = B.USERTEMPLET_ID AND B.OBJID = C.DEVICEID AND A.ID = P_TEMPLETEID
  order by C.DEVICENAME;
BEGIN
  STR := '; ' || CHR(13);
  str_length := 0;
     FOR REC IN CUR LOOP
           str_length:= str_length + 3 + length(REC.DEVICENAME);
           if str_length < 3500 then
             V_DEVNAME_LIST := V_DEVNAME_LIST || REC.DEVICENAME || STR;
           end if;
          EXIT WHEN CUR%NOTFOUND;
     END LOOP;
     RETURN V_DEVNAME_LIST;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN RETURN NULL;
     WHEN OTHERS THEN RETURN NULL;
END F_TEMPLETEID_TO_DEVCOLLECT;

--------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION F_Customer_Ip(cid IN VARCHAR2) RETURN VARCHAR2 IS
     V_IP_LIST VARCHAR2(500);
     CURSOR CUR IS
  SELECT ip_address FROM NFA_SYS_SUACCOUNT_VIEW@guankong.zznode
  WHERE serial_no = cid
  ORDER BY ip_address;
BEGIN
  V_IP_LIST := NULL;
     FOR REC IN CUR LOOP
      EXIT WHEN CUR%NOTFOUND;
    IF V_IP_LIST IS NULL THEN
             V_IP_LIST := REC.ip_address;
   ELSE
      V_IP_LIST := V_IP_LIST||','||REC.ip_address;
   END IF;
     END LOOP;
     RETURN V_IP_LIST;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN RETURN NULL;
     WHEN OTHERS THEN RETURN NULL;
END F_Customer_Ip;
分享到:
评论

相关推荐

    Oracle PLSQL实例精解(原书第4版) 源码下载

    学习Oracle PL/SQL,你需要掌握以下几个核心知识点: 1. **基础语法**:包括变量声明、条件语句(IF-THEN-ELSIF, CASE)、循环结构(WHILE, FOR, LOOP)、异常处理(BEGIN-EXCEPTION-END)等。 2. **数据类型**:...

    oracle 的函数、存储过程、游标、简单实例

    本主题将深入探讨Oracle中的几个核心概念:函数、存储过程、游标以及简单的实例,这些都是数据库管理员和开发人员日常工作中不可或缺的部分。 首先,我们来了解**Oracle函数**。函数是预定义的代码块,接受零个或多...

    asp链接oracle数据库实例

    总之,这个项目展示了如何在ASP环境中利用ADO连接Oracle数据库进行数据交互。通过分析`inc.asp`文件,我们可以学习到数据库连接、SQL执行、错误处理等基本技巧,并理解这些文件是如何协同工作的。

    oracle进阶实例代码

    根据提供的标题、描述、标签及部分内容,我们可以提炼出Oracle数据库中的几个重要的知识点,这些知识点主要集中在存储过程(Stored Procedure)与函数(Function)的创建与使用上,同时也涉及到了游标(Cursor)的...

    深入浅出Oracle EBS之Workflow实例详解

    ### 深入浅出Oracle EBS之Workflow实例详解 #### 一、Oracle Workflow 基础 **1.1 工作流概述** Oracle E-Business Suite (EBS) 中的工作流(Workflow)是一项核心的技术组件,它主要用于管理EBS中的业务流程,...

    Oracle Workflow实例详解

    工作流在 EBS (Enterprise Business Suite) 中扮演着重要的角色,主要体现在以下几个方面: - **通知和审批控制**:工作流可以根据预设条件自动触发通知和审批任务,确保重要决策经过适当的审核。 - **账户自动化...

    Oracle_SQL_function.rar_oracle

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其SQL语法丰富且..."Oracle_SQL_function.ppt"这个文件很可能是PPT格式的教程,其中详细讲解了这些函数的用法和实例,建议深入学习以提升Oracle SQL操作技能。

    ORACLE_FUNCTION

    根据给定的文件信息,我们可以深入探讨几个关键的知识点:创建表、插入数据、事务管理、游标使用、动态SQL以及条件性数据操作。 ### 创建表与数据插入 文件中的示例展示了如何创建两个表:`ORDER_DETAIL`和`salary...

    oracle存储过程学习经典[语法+实例+调用]

    关于Oracle存储过程的若干问题备忘中提到了几个关键点: 1. 在Oracle中,数据表别名不能加as。 2. 在存储过程中,使用select某字段时,后面必须紧跟into,这是因为需要将查询结果存储在变量中。如果select整个记录,...

    Oracle开发的over函数

    #### 二、Oracle分析函数简单实例 为了更好地理解Oracle分析函数的作用,我们先来看一个简单的示例。假设有一个员工表EMPLOYEE,其中包含员工ID(EMP_ID)、部门编号(DEPT_NO)、姓名(ENAME)以及薪水(SAL)等...

    Oracle11g PLSQL Programming(pdf & source)

    这本书籍可能涵盖了以下几个关键知识点: 1. **PL/SQL基础**:介绍PL/SQL的基本语法,包括变量声明、控制流语句(如IF-THEN-ELSE、WHILE、FOR循环)、子程序(PROCEDURE和FUNCTION)定义以及异常处理。 2. **块...

    Oracle数据库DBA面试题

    - **ORACLE_BASE**:Oracle软件的根目录,通常包含多个产品版本。 - **ORACLE_HOME**:特定Oracle产品的安装目录,包括二进制文件、库文件等。 #### 21. 如何判断数据库的时区? 可以通过执行以下SQL查询来确定...

    Oracle设置系统参数进行性能优化

    SGA主要包括共享池(Shared Pool)、数据缓冲区(Buffer Cache)以及其他几个部分。 ##### 1. 共享池调优 (Shared Pool Tuning) 共享池是SGA的一个关键组成部分,主要存储了数据字典缓存和库缓存等数据结构。对于性能...

    sql面试题\oracle面试题目

    - **FUNCTION**:返回一个值。 - **PROCEDURE**:执行一系列操作,无返回值。 - **PACKAGE**:封装一组相关的函数和过程,提供命名空间管理和安全性。 #### 25. TABLE Function的用途 - 提供了一种灵活的方式来处理...

    oracle数据库

    8. 复制技术(Replication):Oracle提供了几种复制解决方案,如逻辑复制(Logical Replication)、物理复制(Physical Replication)和流复制(Stream Replication),以满足不同场景下的数据同步需求。 9. 高可用...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    在高级PL/SQL解决方案的设计与开发中,读者将深入理解以下几个关键知识点: 1. **PL/SQL基础**:涵盖PL/SQL的基本语法,包括变量声明、常量定义、条件语句(IF-THEN-ELSIF-ELSE)、循环结构(WHILE, FOR)、异常...

Global site tag (gtag.js) - Google Analytics