常用到的orcale資料庫方法

2021-06-07 12:34:37 字數 4302 閱讀 9461

判斷是不是時間格式:

create or replace function is_date(mystr varchar2) return varchar2

isstr varchar2(400);

isdate varchar2(10);

mydate date;

begin

isdate := 'n';

str:=trim(mystr);

if str is null then

goto non_date;

end if;

begin

mydate := to_date(str,'yyyy-mm-dd hh24:mi:ss');

isdate := 'y';

exception

when others then

isdate := 'n';

end;

<>

return isdate;

end;

分割函式:

create or replace type type_split as table of varchar2(4000)

分割業務狀態的方法:

create or replace function my_split(p_list varchar2, p_sep varchar2) return type_split

pipelined is

l_idx  pls_integer;

v_list varchar2(32767) := p_list;

begin

loop

l_idx := instr(v_list, p_sep);

if l_idx > 0 then

pipe row(substr(v_list, 1, l_idx - 1));

v_list := substr(v_list, l_idx + length(p_sep));

else

pipe row(v_list);

exit;

end if;

end loop;

return;

end my_split;

將字串轉換為二進位制:

--dbms_output.put_line('正數結果'||v_rtn);

--補全32位高位0

select lpad(v_rtn,32,0)

into   v_rtn

from dual;

--dbms_output.put_line('正數補全結果'||v_rtn);

else

--轉換為二進位制同時按位取反

loop

v_n2 := mod(v_n1, 2);

if v_n2 = 1 then

v_n2 := 0;

elsif v_n2 = 0 then

v_n2 := 1;

end if;

v_n1  := abs(trunc(v_n1 / 2));

v_rtn := to_char(v_n2) || v_rtn;

exit when v_n1 = 0;

end loop;

--dbms_output.put_line('負數結果'||v_rtn);

--補全32位高位1

select lpad(v_rtn,32,1)

into   v_rtn

from dual;

--dbms_output.put_line('負數補全1結果'||v_rtn);

--二進位制轉換為10機制,同時+1

select sum(data1) + 1

into v_n1

from (select substr(v_rtn, rownum, 1) * power(2, length(v_rtn) - rownum) data1

from dual

connect by rownum <= length(v_rtn));

-- dbms_output.put_line('轉換為十進位制數結果'||v_rtn);

----轉換為二進位制

loop

v_n2 := mod(v_n1, 2);

v_n1  := abs(trunc(v_n1 / 2));

v_rtn := to_char(v_n2) || v_rtn;

exit when v_n1 = 0;

end loop;

--dbms_output.put_line('負數轉換結果'||v_rtn);

--補全32位高位0

select lpad(v_rtn,32,0)

into   v_rtn

from dual;

--dbms_output.put_line('負數補全0結果'||v_rtn);

end if;

return v_rtn;

end;

將上面的二進位制串分解為二為底的多少次的底數集合:比如11返回(3,1,0)即:

create or replace function fn_power_of_two(vi_bin_str in varchar2)

return varchar2

ispos_*** number default 0;  --記錄32位的2進製字串中,1出現的位置

i number default 1;--控制迴圈的引數

str_comma varchar2(10) default ',';

str_return varchar2(500);

begin

loop

pos_***:=instr(vi_bin_str,'1',1,i);

if pos_*** >0 then

str_return := str_return||to_char(32-pos_***)||str_comma;

else

str_return:=substr(str_return,1,length(str_return)-1);

end if;

i:= i+1;

exit when pos_*** = 0;

end loop;

return str_return;

end;

輸入2個數字,判定他們是否存在交集,用來處理多個選擇的時候的組合,從輸入來判定某資源是否有該許可權(比如要查詢可選,w,r,d,x,但某個文字是w型的。如果輸入包含w,那麼可選,否則不可選)

create or replace function object_task_status_ex(vi_task_status        in number,

vi_object_task_status in varchar2)

return number is

status_***   number default 0; --需要返回的值

v_has_status varchar2(20);          --web上輸入的數字按照2的冪分割

str_comma varchar2(10) default ',';   --記錄分割符號

temp_str varchar(10);                 --記錄分割出來的值

type type_cursor is ref cursor;

v_cursor type_cursor;

v_cursor_sql varchar2(200);

begin

v_has_status := fn_power_of_two(to_binary(vi_task_status));

v_has_status :=''''||v_has_status||'''';

str_comma :=''',''';

v_cursor_sql :='select * from table(test_split('||v_has_status||','||str_comma||'))';

open v_cursor for v_cursor_sql;

loop

fetch v_cursor into temp_str;

exit when v_cursor%notfound;

if instr(vi_object_task_status, temp_str, 1, 1) > 0 then

status_*** := 1;

exit;

else

status_*** := 0;

end if;

end loop;

close v_cursor;

return status_***;

end;

徹底解除安裝orcale資料庫方法

1.停止所有與oracle相關的服務。2.使用oracle自帶解除安裝程式 oui oracle universal installer 解除安裝oracle軟體。開始 程式 oracle oradb110g home1 oracle installation product universal i...

Orcale資料庫基礎

orcale資料庫的主要特點 orcale資料型別 char資料型別 當需要固定長度的字串時,使用char資料型別。這種資料型別的列長度可以是1 2000位元組,如果在定義時未指明大小,其預設占用1位元組。varchar2資料型別 varchar2資料型別支援可變長度的字串。該資料型別的大小為1 4...

ORCALE資料庫分頁查詢

orcale資料庫分頁查詢 orcale資料庫實現分頁查詢可以使用row number 函式或者使用rownum 虛列兩種方法。第一種 利用分析函式row number 方法 select from select t.row number over order by t1.id rowno from...