ORACLE帶字元的自增值儲存過程的實現

2021-04-22 22:44:18 字數 2222 閱讀 9305

/*

@author:brunowu

@date:20080416

@desc:輸入乙個編號,找到下乙個自動編號的值,如輸入99,下乙個編號就為:1a,

*/procedure p_gen_cusno

(v_cusnocode_in   varchar2,--輸入自編號

o_cusnocode  out varchar2--下乙個自動編號)as

sub_a varchar2(1);

sub_b varchar2(1);

v_cusnocode varchar2(2);

v_ascii_a number;

v_ascii_b number;

begin

if length(v_cusnocode_in)<>2 then --如果輸入的值長度不為2,直接退出

goto eend;

end if;

v_cusnocode:=substr(v_cusnocode_in,1,2);

sub_a:=substr(v_cusnocode,1,1);

sub_b:=substr(v_cusnocode,2,1);

if v_cusnocode='99' then

o_cusnocode:='1a';

goto eend;

end if;

if v_cusnocode='9z' then

o_cusnocode:='a1';

goto eend;

end if;

if v_cusnocode='zz' then

o_cusnocode:='aa';

goto eend;

end if;

select a.ascii_a into v_ascii_a from dual

left join

( select ascii(sub_a) as ascii_a from dual

)a on 1=1;

select a.ascii_b into v_ascii_b from dual

left join

( select ascii(sub_b) as ascii_b from dual

)a on 1=1;

--  00~99 1a~9z

--1第一位為數字,第二個為數字或字母

if  (v_ascii_a >=48 and v_ascii_a<=57) and( (v_ascii_b >=48 and v_ascii_b<=57) or (v_ascii_b >=65 and v_ascii_b<=90) ) then

-- 1.1 第二個為字母

if v_ascii_b>=65 and v_ascii_b<=90 then

if  v_ascii_a =48  then --開為為0,直接到 "1a"

o_cusnocode:='1a';

goto eend;

elsif   v_ascii_b =90 then   --如果尾數為'z'

o_cusnocode:=chr(v_ascii_a+1)||'a';

goto eend;

else 

o_cusnocode:=sub_a||chr(v_ascii_b+1);

goto eend;

end if ;

-- 1.2 第二個為數字

else

o_cusnocode:=to_char(to_number(v_cusnocode)+1,'00');

goto eend;

end if; 

end if;

--  a1~zz

if v_ascii_a >=65 and v_ascii_a<=90 then

if v_ascii_b=90 then   --如果尾數為'z'

o_cusnocode:=chr(v_ascii_a+1)||'1';

goto eend;

elsif v_ascii_b=57 then --如果尾數為'9'

o_cusnocode:=sub_a||'a';

goto eend;

else

o_cusnocode:=sub_a||chr(v_ascii_b+1);

goto eend;

end if; 

end if;

<>

null;

end;

Oracle帶引數的儲存過程

一 需求 為指定的員工,漲100塊錢的工資 並且列印漲前和漲後的薪水。二 帶引數儲存過程 給指定的員工漲 100,並且列印漲前和漲後的薪水 如何呼叫 begin raisesalay 7839 raisesalay 7566 commit end create orreplace procedure...

Oracle 帶引數的儲存過程

1 建立儲存過程 create procedure updatedemo ageparam in number asbegin update demo set age ageparam commit end 2 傳參執行 begin updatedemo 20 end 3 為儲存過程設定引數的預設值...

oracle儲存過程 帶引數的儲存過程

帶引數的儲存過程 舉例 為指定的員工漲100元的工資,列印漲前和漲後的工資 如果帶參,需要指定是輸入引數還是輸出引數 create orreplace procedure raisesalary eno in number as 定義乙個變數儲存漲前的薪水,引用emp中sal的型別作為psal的型別...