zoukankan      html  css  js  c++  java
  • functions 示例



    示例1:  “,”字符串截取



      1 CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2, p_INDEX IN NUMBER)
      2     RETURN varchar2
      3 AS
      4     v_length   NUMBER := LENGTH(p_string);
      5     v_start    NUMBER := 1;
      6     v_index    NUMBER;
      7     v_ret VARCHAR2(20);
      8     v_count NUMBER := 1;
      9 BEGIN
     10     WHILE(v_start <= v_length)
     11     LOOP
     12         v_index := INSTR(p_string, p_delimiter, v_start);
     13         v_ret := substr(p_string,v_start,v_index-1);
     14         v_start :=  v_index+1;
     15         IF v_count = p_index THEN
     16          RETURN v_ret;
     17         END IF;
     18         v_count := v_count + 1;
     19     END LOOP;
     20 
     21     RETURN v_ret;
     22 END splitstr;



    示例2:解析分组函数

      1 create or replace function resolve_group_sql(v_sql varchar2,in_flowCode varchar2,
      2 in_nodesCode varchar2, in_workId varchar2, in_userId varchar2) return varchar2 is
      3 /******************************************
      4        解析分组函数
      5 ***************************************/
      6   Result varchar2(3000);
      7       v_start  INT;
      8       v_start2  INT;
      9       v_count  INT;
     10       v_count2  INT;
     11       i_count  INT;
     12       v_tm_sql varchar2(3000);
     13       v_tm_str varchar2(3000);
     14       v_tm_code varchar2(200);
     15       v_tm_code2 varchar2(200);
     16       v_value varchar2(30);
     17 begin
     18       v_tm_sql:=v_sql;
     19 /*      i_count:=0;
     20       while (instr(v_tm_sql,'{')>0) loop
     21             v_start:=instr(v_tm_sql,'{')+1;
     22             v_count:=instr(v_tm_sql,'}')- v_start;
     23             v_tm_code:=substr(v_tm_sql,v_start,v_count);
     24             i_count:=i_count+1;
     25 
     26             v_tm_str:=v_tm_code;
     27             while (instr(v_tm_str,'%[')>0) loop
     28               v_start2:=instr(v_tm_str,'%[')+2;
     29               v_count2:=instr(v_tm_str,']')- v_start2;
     30               v_tm_code2:=substr(v_tm_str,v_start2,v_count2);
     31               v_value:=get_constant_val(v_tm_code2);
     32               v_tm_str:=replace(v_tm_str,'%['||v_tm_code2||']',v_value);
     33             end loop;
     34             select  v_tm_str into v_value from dual;
     35 
     36            v_tm_sql:=replace(v_tm_sql,'{'||v_tm_code||'}',v_value);
     37 
     38       end loop;*/
     39 
     40         --解析常量
     41       i_count:=0;
     42       while (instr(v_tm_sql,'%[')>0) loop
     43             v_start:=instr(v_tm_sql,'%[')+2;
     44             v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
     45             v_tm_code:=substr(v_tm_sql,v_start,v_count);
     46             v_value:=get_constant_val(v_tm_code);
     47            v_tm_sql:=replace(v_tm_sql,'%['||v_tm_code||']',v_value);
     48       end loop;
     49 
     50          --解析接口参数
     51       i_count:=0;
     52       while (instr(v_tm_sql,'&[')>0) loop
     53             v_start:=instr(v_tm_sql,'&[')+2;
     54             v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
     55             v_tm_code:=substr(v_tm_sql,v_start,v_count);
     56             v_value:=get_param_val(v_tm_code,in_flowCode,in_nodesCode,in_workId,in_userId);
     57            v_tm_sql:=replace(v_tm_sql,'&['||v_tm_code||']',v_value);
     58       end loop;
     59 
     60       --去掉{}符号
     61       v_tm_sql:=replace(v_tm_sql,'{','');
     62       v_tm_sql:=replace(v_tm_sql,'}','');
     63 
     64       Result:=v_tm_sql;
     65   return(Result);
     66 end resolve_group_sql;
     67 


    示例3:获取主键id


      1 CREATE OR REPLACE FUNCTION NEXTID(NOID_ IN VARCHAR2) RETURN NUMBER AS
      2   PRAGMA AUTONOMOUS_TRANSACTION;
      3   RESULT   NUMBER; --返回结果
      4   IS_EXIST NUMBER; --是否存在,0 不尊在 1 存在
      5 BEGIN
      6   -- 判断非空
      7   IF NOID_ IS NULL OR NOID_ = '' THEN
      8     RETURN NULL;
      9   END IF;
     10   --判断是否存在序列 NOID
     11 
     12   SELECT COUNT(*) INTO IS_EXIST FROM PWP_NO WHERE NOID = NOID_;
     13   IF IS_EXIST = 1 THEN
     14     -- 存在主表信息
     15     SELECT COUNT(*) INTO IS_EXIST FROM PWP_NODTL WHERE NOID = NOID_;
     16     IF IS_EXIST = 1 THEN
     17       -- 存在明细表信息,查询需要的结果
     18       SELECT NEXTID INTO RESULT FROM PWP_NODTL WHERE NOID = NOID_;
     19       -- 更新nextid为下一个id
     20       UPDATE PWP_NODTL SET NEXTID = NEXTID + 1 WHERE NOID = NOID_;
     21     ELSIF IS_EXIST = 0 THEN
     22       --不存在明细表信息,明细表插入数据,nextid设置为2,返回1
     23       INSERT INTO PWP_NODTL
     24         (NOID,
     25          PREFIX,
     26          NODAY,
     27          NEXTID,
     28          POSTFIX,
     29          NOINCREMENT,
     30          NOYEAR,
     31          NOMONTH)
     32       VALUES
     33         (NOID_,
     34          NULL,
     35          0,
     36          2,
     37          NULL,
     38          1,
     39          TO_CHAR(SYSDATE, 'yyyy'),
     40          TO_CHAR(SYSDATE, 'MM'));
     41 
     42       RESULT := 1;
     43     END IF;
     44   END IF;
     45 
     46   -- 提交
     47   COMMIT;
     48   --返回
     49   RETURN(RESULT);
     50 END NEXTID;
     51 


    示例4:拼接字符串“,”


      1 create or replace function GET_YKJF_YKJHID( v_zbz_bal_id in  number,
      2                                             v_gk_ykjhsphz_id in number)
      3   return varchar2 is
      4   result varchar2(4000);
      5 begin
      6 
      7   if v_zbz_bal_id is not null  and v_gk_ykjhsphz_id is not null  then
      8     for temp_cursor in (select distinct zc.id
      9                            from gk_ykjh zc, gk_ykjh_mx zcm,gk_ykjh_sphz_mx zsm
     10                          where zc.id = zcm.gk_ykjh_id
     11                            and zsm.gk_ykjh_id=zc.id
     12                            and zcm.zbz_bal_id = v_zbz_bal_id
     13                            and zsm.gk_ykjhsphz_id = v_gk_ykjhsphz_id
     14                          order by zc.id) loop
     15       result := result || temp_cursor.id || ',';
     16     end loop;
     17     result := rtrim(result, ',');
     18 
     19 
     20   -----------------------------------------------------------------------------------------------
     21 
     22   else
     23     result := '';
     24   end if;
     25    dbms_output.put_line(result);
     26   return result;
     27 end;
     28 


      1 create or replace function get_var_val(in_code varchar2, in_pid VARCHAR2, v_sql varchar2, in_group_id varchar2,
      2 vartype in number, null_value in varchar2,in_flowCode varchar2, in_nodesCode varchar2,
      3  in_workId varchar2, in_userId varchar2) return varchar2 is
      4 /******************************************
      5        获取取数函数
      6 ***************************************/
      7   Result varchar2(200);
      8       type emp_array is Table OF varchar2(200) INDEX BY BINARY_INTEGER;
      9       TYPE CURSOR_TYPE IS REF CURSOR; --声明动态游标
     10       my_cursor CURSOR_TYPE; --声明游标变量
     11       a_field_params emp_array; -- 取数sql中的分组字段数组
     12       a_group_name emp_array; -- 取数sql中的分组字段数组
     13       a_group_type emp_array; -- 取数sql中的分组字段类型
     14       a_group_value emp_array; -- 取数sql中的分组字段数组
     15       a_var_params emp_array; --取数代码数组
     16       a_var_values emp_array; --取数代码值数组
     17       cursor_handle INTEGER;
     18       tmp_return  INTEGER;
     19       v_start  INT;
     20       v_count  INT;
     21       i_count  INT;
     22       v_tm_sql varchar2(1000);
     23       v_tm_code varchar2(30);
     24       v_value varchar2(200);
     25       v_error_msg varchar2(4000);
     26 begin
     27       v_tm_sql:=v_sql;
     28       i_count:=0;
     29        while (instr(v_tm_sql,'#[')>0) loop
     30           v_start:=instr(v_tm_sql,'#[')+2;
     31           v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
     32           v_tm_code:=substr(v_tm_sql,v_start,v_count);
     33 
     34 /*          open my_cursor for 'SELECT T.GVALUE  FROM  zz_tmp_variable T WHERE T.group_id = '''||in_group_id||'''' ||' and T.CODE = '''||v_tm_code||'''';
     35              loop
     36                  fetch my_cursor into v_value;
     37                  exit when my_cursor%notfound;
     38              end loop;
     39           close my_cursor;*/
     40 
     41           SELECT T.GVALUE into v_value FROM  zz_tmp_variable T
     42           WHERE T.group_id =in_group_id
     43             and T.CODE = v_tm_code and rownum=1
     44             AND T.PID=in_pid ;
     45 
     46           if v_value='null' then
     47              Result:='null';
     48              return(Result);
     49           end if;
     50            v_tm_sql:=replace(v_tm_sql,'#['||v_tm_code||']',':'||v_tm_code);
     51            i_count:=i_count+1;
     52            a_var_params(i_count):=v_tm_code;
     53            a_var_values(i_count):=v_value;
     54        end loop;
     55 
     56     --解析SQL中的分组字段start
     57  --去掉'.'符号,若不去掉绑定变量的时候会找不到变量start
     58       i_count:=0;
     59       while (instr(v_tm_sql,'$[')>0) loop
     60             v_start:=instr(v_tm_sql,'$[')+2;
     61             v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
     62             v_tm_code:=substr(v_tm_sql,v_start,v_count);
     63             i_count:=i_count+1;
     64            v_tm_sql:=replace(v_tm_sql,'$['||v_tm_code||']',':'||replace(v_tm_code,'.',''));
     65            a_field_params(i_count):=replace(v_tm_code,'.','');
     66       end loop;
     67        --去掉'.'符号,若不去掉绑定变量的时候会找不到变量end
     68 
     69        select t.value1,t.value2,t.value3,t.value4,t.value5,t.value6,t.value7,t.value8,t.value9,t.value10
     70        into a_group_value(1),a_group_value(2),a_group_value(3),a_group_value(4),a_group_value(5)
     71        ,a_group_value(6),a_group_value(7),a_group_value(8),a_group_value(9),a_group_value(10)
     72         from zz_tmp_group t where t.id=in_group_id and t.pid=in_pid;
     73 
     74        select t.name1,t.name2 ,t.name3,t.name4,t.name5,t.name6,t.name7,t.name8,t.name9,t.name10
     75        into a_group_name(1),a_group_name(2),a_group_name(3),a_group_name(4),a_group_name(5)
     76        ,a_group_name(6),a_group_name(7),a_group_name(8),a_group_name(9),a_group_name(10)
     77         from zz_tmp_group t where t.id=in_group_id and t.pid=in_pid;
     78 
     79        select t.type1,t.type2 ,t.type3,t.type4,t.type5,t.type6,t.type7,t.type8,t.type9,t.type10
     80        into a_group_type(1),a_group_type(2),a_group_type(3),a_group_type(4),a_group_type(5)
     81        ,a_group_type(6),a_group_type(7),a_group_type(8),a_group_type(9),a_group_type(10)
     82         from zz_tmp_group t where t.id=in_group_id and t.pid=in_pid;
     83 
     84   --解析SQL中的分组字段end
     85 
     86   --解析常量
     87       i_count:=0;
     88       while (instr(v_tm_sql,'%[')>0) loop
     89             v_start:=instr(v_tm_sql,'%[')+2;
     90             v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
     91             v_tm_code:=substr(v_tm_sql,v_start,v_count);
     92             v_value:=get_constant_val(v_tm_code);
     93            v_tm_sql:=replace(v_tm_sql,'%['||v_tm_code||']',v_value);
     94       end loop;
     95 
     96     --去掉{}符号
     97   v_tm_sql:=replace(v_tm_sql,'{','');
     98   v_tm_sql:=replace(v_tm_sql,'}','');
     99 
    100      --解析接口参数
    101   i_count:=0;
    102   while (instr(v_tm_sql,'&[')>0) loop
    103         v_start:=instr(v_tm_sql,'&[')+2;
    104         v_count:=get_end_pos(v_tm_sql,v_start)- v_start;
    105         v_tm_code:=substr(v_tm_sql,v_start,v_count);
    106         v_value:=get_param_val(v_tm_code,in_flowCode,in_nodesCode,in_workId,in_userId);
    107        v_tm_sql:=replace(v_tm_sql,'&['||v_tm_code||']',v_value);
    108   end loop;
    109 
    110   --执行取数sql开始
    111     cursor_handle := DBMS_SQL.OPEN_CURSOR;
    112   dbms_sql.parse(cursor_handle,v_tm_sql,dbms_sql.native);
    113 
    114   --替换绑定取数值start
    115   for i in 1..a_var_params.count loop
    116         dbms_sql.bind_variable(cursor_handle,a_var_params(i),a_var_values(i)) ;
    117   end loop;
    118     --替换绑定取数值end
    119 
    120     i_count:=0;
    121     for i in 1..a_group_name.count loop
    122           if a_group_name(i) is not null then
    123              i_count:=i_count+1;
    124           end if;
    125     end loop;
    126 
    127       --绑定分组字段start
    128   for i in 1..a_field_params.count loop
    129           for j in 1..i_count loop
    130               if a_field_params(i)=replace(a_group_name(j),'.','') then
    131                  if a_group_type(j)='date' then
    132                    dbms_sql.bind_variable(cursor_handle,a_field_params(i),to_date(a_group_value(j)));
    133                  else
    134                    dbms_sql.bind_variable(cursor_handle,a_field_params(i),a_group_value(j));
    135                  end if;
    136 
    137               end if;
    138          end loop;
    139   end loop;
    140     --绑定分组字段end
    141 
    142 
    143 
    144     --绑定常量值start
    145 /*  for i in 1..a_constant.count loop
    146         dbms_sql.bind_variable(cursor_handle,a_constant(i),get_constant_val(a_constant(i),v_constant_type)) ;
    147   end loop;*/
    148     --绑定常量值end
    149 
    150   dbms_sql.define_column(cursor_handle, 1, Result,200);
    151   tmp_return :=dbms_sql.EXECUTE(cursor_handle);
    152   if dbms_sql.fetch_rows(cursor_handle)>0 then
    153         dbms_sql.column_value(cursor_handle,1,Result);
    154   end if;
    155   if Result is null then
    156         if null_value='1' then
    157            Result:='null';
    158         elsif null_value='2' then
    159            Result:='0';
    160         elsif null_value='3' then
    161            Result:='';
    162         end if;
    163   end if;
    164   if (vartype=3 ) then Result:=to_char(to_date(Result),'YYYY-MM-DD'); end if;
    165   Result:=TO_CHAR(Result);
    166  dbms_sql.close_cursor(cursor_handle);
    167  --执行取数sql结束
    168   return(Result);
    169   exception when others then
    170      v_error_msg:='取数编码:'||in_code||'解析出错 sqlerrm:'||substr(sqlerrm,1,3000);
    171      DBMS_OUTPUT.PUT_LINE(v_error_msg);
    172      Result:='null';
    173      return result;
    174 
    175 end get_var_val;
    176 



    示例5:blob  clob 之间的转化

      1 CREATE OR REPLACE FUNCTION blob_to_varchar(
      2     blob_in IN BLOB)
      3   RETURN VARCHAR2
      4 IS
      5   v_varchar VARCHAR2(4000);
      6   v_start Pls_Integer  := 1;
      7   v_buffer Pls_Integer := 4000;
      8 BEGIN
      9   IF Dbms_Lob.Getlength(blob_in) IS NULL THEN
     10     RETURN '';
     11   END IF;
     12 FOR I IN 1..Ceil(Dbms_Lob.Getlength(blob_in) / V_Buffer)
     13 LOOP
     14   --当转换出来的字符串乱码时,可尝试用注释掉的函数
     15   --v_varchar := Utl_Raw.Cast_To_Varchar2(Utl_Raw.Convert(Dbms_Lob.Substr(blob_in, v_buffer, v_start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'AMERICAN_THE NETHERLANDS.UTF8'));
     16     v_varchar := Utl_Raw.Cast_To_Varchar2(Dbms_Lob.Substr(blob_in, v_buffer, v_start));
     17   v_start := v_start + v_buffer;
     18 END LOOP;
     19 RETURN v_varchar;
     20 END ;
     21 


      1 CREATE OR REPLACE FUNCTION B2C(P_BLOB BLOB) RETURN CLOB AS
      2   L_CLOB       CLOB;
      3   AMOUNT       NUMBER;
      4   DEST_OFFSET  NUMBER;
      5   SRC_OFFSET   NUMBER;
      6   BLOB_CSID    NUMBER;
      7   LANG_CONTEXT NUMBER;
      8   WARNING      NUMBER;
      9 BEGIN
     10   DBMS_LOB.CREATETEMPORARY(L_CLOB, TRUE);
     11   AMOUNT       := DBMS_LOB.GETLENGTH(P_BLOB);
     12   DEST_OFFSET  := 1;
     13   SRC_OFFSET   := 1;
     14   BLOB_CSID    := NLS_CHARSET_ID('UTF8');
     15   LANG_CONTEXT := DBMS_LOB.DEFAULT_LANG_CTX;
     16   DBMS_LOB.CONVERTTOCLOB(L_CLOB,
     17                          P_BLOB,
     18                          AMOUNT,
     19                          DEST_OFFSET,
     20                          SRC_OFFSET,
     21                          BLOB_CSID,
     22                          LANG_CONTEXT,
     23                          WARNING);
     24   RETURN L_CLOB;
     25 EXCEPTION
     26   WHEN OTHERS THEN
     27     RETURN NULL;
     28 END;
     29 


      1 CREATE OR REPLACE FUNCTION C2B(L_CLOB CLOB) RETURN BLOB IS
      2   P_BLOB       BLOB;
      3   AMOUNT       NUMBER;
      4   DEST_OFFSET  NUMBER;
      5   SRC_OFFSET   NUMBER;
      6   BLOB_CSID    NUMBER;
      7   LANG_CONTEXT NUMBER;
      8   WARNING      NUMBER;
      9 BEGIN
     10 
     11   DBMS_LOB.CREATETEMPORARY(P_BLOB, TRUE);
     12   AMOUNT       := DBMS_LOB.GETLENGTH(L_CLOB);
     13   DEST_OFFSET  := 1;
     14   SRC_OFFSET   := 1;
     15   BLOB_CSID    := NLS_CHARSET_ID('UTF8');
     16   LANG_CONTEXT := DBMS_LOB.DEFAULT_LANG_CTX;
     17   DBMS_LOB.CONVERTTOBLOB(P_BLOB,
     18                          L_CLOB,
     19                          AMOUNT,
     20                          DEST_OFFSET,
     21                          SRC_OFFSET,
     22                          BLOB_CSID,
     23                          LANG_CONTEXT,
     24                          WARNING);
     25   RETURN P_BLOB;
     26 END C2B;
     27 
  • 相关阅读:
    第六章:面向对象(下)
    第四章:流程控制和数组
    第三章:数据类型和运算符
    第二章:理解面向对象
    数据库:表设计阶段
    第一章:java语言概述与开发环境
    HTML DOM
    补漏
    不错的资源哦
    阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/ios9/p/8762543.html
Copyright © 2011-2022 走看看