oracle对符号号隔开的多个字段翻译

翻译函数 1

create or replace function FUNC_MANNAME(field_val in varchar2)
    return varchar2
    is
      v_val varchar2(4000);
      v_mult_val varchar2(4000);
      res_back varchar2(4000);
      cursor c_result is
      select t.column_value from table (SPLIT_FOR_ARRAY(field_val,',')) t;
      c_row c_result%rowtype;
    begin
      for c_row in c_result loop
         select a.user_NAME into v_val from ct_user a where a.user_id = c_row.column_value;
        v_mult_val := v_mult_val|| ','||v_val;
      end loop;
      select substr(v_mult_val,2) into res_back from dual;
      return res_back;
      EXCEPTION
      WHEN OTHERS THEN
        RETURN '';
    end FUNC_MANNAME;

或者翻译函数2(对字段处理后再翻译)

create or replace function FUNC_JOIN_ORG(ORG_ID in varchar2)
return varchar2
is
  v_val varchar2(4000);
	v_mult_val varchar2(4000);
	c_result array_container := array_container();
	res_back varchar2(4000);
	c_val varchar2(4000);
begin
	if instr(ORG_ID, ',') > 0 then
		 select SPLIT_FOR_ARRAY(ORG_ID,',') into c_result from dual;
		for c_row in 1..c_result.count loop
			 SELECT wm_concat(party_org_id) into v_val FROM pb_party_org where  state = '1' START WITH party_org_id = ''||c_result(c_row)||''  CONNECT BY nocycle PRIOR party_org_id = last_org;
			 if instr(v_mult_val,v_val) > 0 then 
				 v_mult_val := v_mult_val;
			 else 
			    v_mult_val := v_mult_val|| ','||v_val;
				end if;	
				
		end loop;
		select substr(v_mult_val,2) into res_back from dual;
	else
		SELECT wm_concat(party_org_id) into v_mult_val FROM pb_party_org where  state = '1'
                      START WITH party_org_id = ''||ORG_ID||''
                     CONNECT BY nocycle PRIOR party_org_id = last_org;
		res_back := v_mult_val;
	end if;
	    select FUNC_SPLIT(res_back) into c_val from dual;
		return c_val;
  EXCEPTION
  WHEN OTHERS THEN
    RETURN '';
end FUNC_JOIN_ORG;

工具函数

CREATE OR REPLACE FUNCTION SPLIT_FOR_ARRAY(P_STR       IN VARCHAR2,
                                 P_DELIMITER IN VARCHAR2 DEFAULT (',') --分隔符,默认逗号
                                 )RETURN  array_container  IS
  J        INT := 0;
  I        INT := 1;
  LEN      INT := 0;
  LEN1     INT := 0;
  STR      VARCHAR2(4000);
  MY_SPLIT array_container := array_container();
BEGIN
  LEN  := LENGTH(P_STR);
  LEN1 := LENGTH(P_DELIMITER);

  WHILE J < LEN LOOP
    J := INSTR(P_STR, P_DELIMITER, I);

    IF J = 0 THEN
      J   := LEN;
      STR := SUBSTR(P_STR, I);
      MY_SPLIT.EXTEND;
      MY_SPLIT(MY_SPLIT.COUNT) := STR;

      IF I >= LEN THEN
        EXIT;
      END IF;
    ELSE
      STR := SUBSTR(P_STR, I, J - I);
      I   := J + LEN1;
      MY_SPLIT.EXTEND;
      MY_SPLIT(MY_SPLIT.COUNT) := STR;
    END IF;
  END LOOP;

  RETURN MY_SPLIT;
END SPLIT_FOR_ARRAY;

所需类型

CREATE OR REPLACE TYPE "ARRAY_CONTAINER"  AS TABLE OF varchar2(100)

业务翻译字段

 FUNC_USERNAME(c.join_user_id)    AS psn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值