ORACLE建立自定義函式返回varchar型別

2021-09-27 05:03:50 字數 2375 閱讀 9009

需求描述:兩張表,如下,需要查詢tmp1表中id_new在tmp2中的name

方法一:

好處:簡單,直接sql展示

劣處:如果主表資料量太大,十幾億的話,效能會大大下降,此時建議第二種方法

select a.id_old,

to_char(wm_concat(distinct a.id_new)) id_new,

to_char(wm_concat(distinct b.name)) name

from tmp2 b,

(select a.id_old, regexp_substr(a.id_new, '[^,]+', 1, level) id_new

from tmp1 a

connect by level <= regexp_count(a.id_new, ',') + 1) a

where a.id_new = b.id_old(+)

group by a.id_old;

方法二:建立自定義函式來實現

create or replace function f_tmp_split(p_str varchar2, p_f varchar2)

return varchar2 is

v_pos pls_integer := 0; --獲取當前分隔符位置

v_pre_pos pls_integer := 1; --從第幾位開始擷取

v_len pls_integer := 0; --字串長度

v_len1 pls_integer := 0; --分隔符長度

v_result dbms_sql.varchar2_table; --結果集

v_num pls_integer := 1; --元素數量

v_name_class varchar2(1000); --返回的集合

v_name_tmp varchar2(1000); --返回拼接的值

begin

v_len := length(p_str);

v_len1 := length(p_f);

while v_pos < v_len loop

v_pos := instr(p_str, p_f, v_pre_pos);

if v_pos = 0 then

v_pre_pos := v_len;

v_result(v_num) := substr(p_str, v_pre_pos);

begin

select a.name

into v_name_tmp

from tmp2 a

where a.id_old = v_result(v_num);

exception

when no_data_found then

v_name_tmp := '';

end;

v_name_class := v_name_class || v_name_tmp;

if v_pre_pos >= v_len then

exit;

end if;

else

v_result(v_num) := substr(p_str, v_pre_pos, v_pos - v_pre_pos);

begin

select a.name || p_f

into v_name_tmp

from tmp2 a

where a.id_old = v_result(v_num);

exception

when no_data_found then

v_name_tmp := '';

end;

v_name_class := v_name_class || v_name_tmp;

v_pre_pos := v_pos + v_len1;

end if;

end loop;

return v_name_class;

end;

效果如下:

Oracle自定義函式

語法如下 create or replace function function name argment type,argment type return return type 返回資料的型別 變數的申明,比如 stryuan varchar2 150 begin function body 函...

oracle 自定義函式

下面是乙個前輩寫的判斷是否是手機號的函式 create or replace function ismobile pmsg varchar2 return number isvprefix varchar2 20 vlen number begin vlen lengthb pmsg if vlen...

Oracle自定義函式

二 刪除自定義函式 三 應用經驗 在oracle資料庫中,為了實現特定的功能,可以自定義函式,就像c c 語言,除了系統的庫函式,程式設計師還會編寫很多自定義的函式。create or replace function 函式名 引數1 模式 資料型別,return 資料型別 as 定義區域性變數。變...