判斷是不是時間格式:
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...