oracle正則表達式

ORACLE中的支持正則表達式的函數主要有下面四個:
1,REGEXP_LIKE :與LIKE的功能類似
2,REGEXP_INSTR :與INSTR的功能類似
3,REGEXP_SUBSTR :與SUBSTR的功能類似
4,REGEXP_REPLACE :與REPLACE的功能類似
它們在用法上與Oracle SQL 函數LIKE、INSTR、SUBSTRREPLACE 用法相同,
可是它們使用POSIX 正則表達式代替了老的百分號(%)和通配符(_)字符。
POSIX 正則表達式由標準的元字符(metacharacters)所構成:
'^' 匹配輸入字符串的開始位置,在方括號表達式中使用,此時它表示不接受該字符集合。
'$' 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n''\r'
'.' 匹配除換行符以外的任何單字符。
'?' 匹配前面的子表達式零次或一次。
'+' 匹配前面的子表達式一次或屢次。
'*' 匹配前面的子表達式零次或屢次。
'|' 指明兩項之間的一個選擇。例子'^([a-z]+|[0-9]+)$'表示全部小寫字母或數字組合成的
字符串。
'( )' 標記一個子表達式的開始和結束位置。
'[]' 標記一箇中括號表達式。
'{m,n}' 一個精確地出現次數範圍,m=<出現次數<=n,’{m}’表示出現m次,’{m,}’表示至少出現m次。
\num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數字。
[[:alnum:]] 任何字母和數字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[:punct:]] 任何標點符號。
[[:xdigit:]] 任何16進制的數字,至關於[0-9a-fA-F]
各類操做符的運算優先級
/轉義符
(), (?:), (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和順序
|
*/git

--建立表
create table fzq
(
id varchar(4),
value varchar(10)
);
--數據插入
insert into fzq values
('1','1234560');
insert into fzq values
('2','1234560');
insert into fzq values
('3','1b3b560');
insert into fzq values
('4','abc');
insert into fzq values
('5','abcde');
insert into fzq values
('6','ADREasx');
insert into fzq values
('7','123 45');
insert into fzq values
('8','adc de');
insert into fzq values
('9','adc,.de');
insert into fzq values
('10','1B');
insert into fzq values
('10','abcbvbnb');
insert into fzq values
('11','11114560');
insert into fzq values
('11','11124560');
--regexp_like
--查詢value中以1開頭60結束的記錄而且長度是7位
select * from fzq where value like '1____60';
select * from fzq where regexp_like(value,'1....60');
--查詢value中以1開頭60結束的記錄而且長度是7位而且所有是數字的記錄。
--使用like就不是很好實現了。
select * from fzq where regexp_like(value,'1[0-9]{4}60');
-- 也能夠這樣實現,使用字符集。
select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');
-- 查詢value中不是純數字的記錄
select * from fzq where not regexp_like(value,'^[[:digit:]]+$');
-- 查詢value中不包含任何數字的記錄。
select * from fzq where regexp_like(value,'^[^[:digit:]]+$');
--查詢以12或者1b開頭的記錄.不區分大小寫。
select * from fzq where regexp_like(value,'^1[2b]','i');
--查詢以12或者1b開頭的記錄.區分大小寫。
select * from fzq where regexp_like(value,'^1[2B]');
-- 查詢數據中包含空白的記錄。
select * from fzq where regexp_like(value,'[[:space:]]');
--查詢全部包含小寫字母或者數字的記錄。
select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');
--查詢任何包含標點符號的記錄。
select * from fzq where regexp_like(value,'[[:punct:]]');1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556複製代碼

例子:判斷姓名是否爲空,少於兩個字符,包含數字和字母正則表達式

create or replace
FUNCTION CheckName(NameStr in VARCHAR2) RETURN integer
As
BEGIN
--符合返回1,不符合返回0
   if(NameStr is null or length(NameStr)<2) then
      return 0;
   else
      if(NameStr like '%未取名%') then
       RETURN 0;
       end if;
       if regexp_like(NameStr,'^([a-z]+|[0-9]+|[A-Z]+)$') then
       return 0;
       end if; 
       return 1;      
   end if;
END CheckName; 
123456789101112131415161718複製代碼

例子:sql

create or replace procedure p_jh_cbs_oc_datagenerate(ddate  in varchar2,result_code out varchar2,
                                                         result_info out varchar2) is
      v_ddate varchar2(8);
      v_sql   varchar2(4000);
    begin
      if ddate is null then
        v_ddate := to_char(sysdate - 1, 'YYYYMMDD');
      elsif length(ddate) = 8 then
        v_ddate := ddate;
      else
        result_code := '9999';
        result_info := '日期輸入不合法,進程終止';
        return;
      end if;
      begin
        execute immediate 'truncate table t_v_sql';
        v_sql := 'insert into t_dc_order_center_detail (ACCEPT_DATE, CITY_CODE, CHANNEL_CODE, TRADE_ID, PAY_MODE, PAPAY_DEPAR, PAY_STATE, PAY_DATE, PAY_ORDERID, PAY_FEE, ORDER_FEE, ORDER_SOURCE, ADVANCE_PAY, SHIP_MODE, SHIPPING_ID, TRADE_STATE, TRADE_TYPE_CODE, PRODUCT_ID, PRODUCT_NAME, SERIAL_NUMBER, ACCOUT_ID, ACCOUT_NAME, TRADE_STAFF_ID, TRADE_STAFFNAME, DEVELOP_NAME, DEVELOP_ID, REMARK, USER_TYPE, CUST_NAME, PSPT_ID, INVALID_DATE, INPUT_DATE, ORDER_TYPE, RELATION_ORDERS, PROPT_CODE, PROP_VALUE, IMPORT_DATE, RESV1, RESV2, RESV3, RESV4, RESV5) select ACCEPT_DATE, CITY_CODE, CHANNEL_CODE, TRADE_ID, PAY_MODE, PAPAY_DEPAR, PAY_STATE, PAY_DATE, PAY_ORDERID, PAY_FEE, ORDER_FEE, ORDER_SOURCE, ADVANCE_PAY, SHIP_MODE, SHIPPING_ID, TRADE_STATE, TRADE_TYPE_CODE, PRODUCT_ID, PRODUCT_NAME, SERIAL_NUMBER, ACCOUT_ID, ACCOUT_NAME, TRADE_STAFF_ID, TRADE_STAFFNAME, DEVELOP_NAME, DEVELOP_ID, REMARK, USER_TYPE, CUST_NAME, PSPT_ID, INVALID_DATE, INPUT_DATE, ORDER_TYPE, RELATION_ORDERS, PROPT_CODE, PROP_VALUE, IMPORT_DATE, RESV1, RESV2, DECODE((SELECT DEVELOP_ID FROM DUAL WHERE REGEXP_LIKE(DEVELOP_ID,''''(WX|KF|DX|ZW) '''')),'',''''2'''',''''3'''' )) RESV3, RESV4, RESV5 from t_dc_order_center where ACCEPT_DATE=' || '''' ||
                 v_ddate || '''';
        -- insert into t_v_sql (v_sql) values (v_sql);
        commit;
        execute immediate v_sql;
        commit;
        v_sql := 'INSERT INTO T_DC_CB_BS_TRADE_DETAIL ( TRADE_ID, SUBSCRIBE_ID, BPM_ID, TRADE_TYPE_CODE, IN_MODE_CODE, PRIORITY, SUBSCRIBE_STATE, NEXT_DEAL_TAG, PRODUCT_ID, BRAND_CODE, USER_ID, CUST_ID, USECUST_ID, ACCT_ID, USER_DIFF_CODE, NET_TYPE_CODE, SERIAL_NUMBER, CUST_NAME, ACCEPT_DATE, ACCEPT_MONTH, TRADE_STAFF_ID, TRADE_DEPART_ID, TRADE_CITY_CODE, TRADE_EPARCHY_CODE, TERM_IP, EPARCHY_CODE, CITY_CODE, OLCOM_TAG, EXEC_TIME, FINISH_DATE, OPER_FEE, FOREGIFT, ADVANCE_PAY, INVOICE_NO, FEE_STATE, FEE_TIME, FEE_STAFF_ID, CANCEL_TAG, CANCEL_DATE, CANCEL_STAFF_ID, CANCEL_DEPART_ID, CANCEL_CITY_CODE, CANCEL_EPARCHY_CODE, CHECK_TYPE_CODE, CHK_TAG, AUDIT_TAG, AUDIT_BATCH_NO, ACTOR_NAME, ACTOR_CERTTYPEID, ACTOR_PHONE, ACTOR_CERTNUM, CONTACT, CONTACT_PHONE, CONTACT_ADDRESS, REMARK, IF_MAINTENANCE, ORDER_ID, SUB_ORDER_ID, MAIN_DISCNT_CODE, PRODUCT_SPEC, STANDARD_KIND_CODE, IMPORT_DATE, SYS_TYPE ) select TRADE_ID, SUBSCRIBE_ID, BPM_ID, TRADE_TYPE_CODE, IN_MODE_CODE, PRIORITY, SUBSCRIBE_STATE, NEXT_DEAL_TAG, PRODUCT_ID, BRAND_CODE, USER_ID, CUST_ID, USECUST_ID, ACCT_ID, USER_DIFF_CODE, NET_TYPE_CODE, SERIAL_NUMBER, CUST_NAME, ACCEPT_DATE, ACCEPT_MONTH, TRADE_STAFF_ID, TRADE_DEPART_ID, TRADE_CITY_CODE, TRADE_EPARCHY_CODE, TERM_IP, EPARCHY_CODE, CITY_CODE, OLCOM_TAG, EXEC_TIME, FINISH_DATE, OPER_FEE, FOREGIFT, ADVANCE_PAY, INVOICE_NO, FEE_STATE, FEE_TIME, FEE_STAFF_ID, CANCEL_TAG, CANCEL_DATE, CANCEL_STAFF_ID, CANCEL_DEPART_ID, CANCEL_CITY_CODE, CANCEL_EPARCHY_CODE, CHECK_TYPE_CODE, CHK_TAG, AUDIT_TAG, AUDIT_BATCH_NO, ACTOR_NAME, ACTOR_CERTTYPEID, ACTOR_PHONE, ACTOR_CERTNUM, CONTACT, CONTACT_PHONE, CONTACT_ADDRESS, REMARK, IF_MAINTENANCE, ORDER_ID, SUB_ORDER_ID, MAIN_DISCNT_CODE, PRODUCT_SPEC, STANDARD_KIND_CODE, IMPORT_DATE, ''BSS'' FROM T_DC_BSS_TRADE where to_char(ACCEPT_DATE,''YYYYMMDD'')=' || '''' ||
                 v_ddate || '''';
        --insert into t_v_sql (v_sql) values (v_sql);
        commit;
        execute immediate v_sql;
        v_sql := 'INSERT INTO t_dc_cb_bs_trade_detail (USER_ID, USER_DIFF_CODE, USECUST_ID, TRADE_TYPE_CODE, TRADE_STAFF_ID, TRADE_ID, TRADE_EPARCHY_CODE, TRADE_DEPART_ID, TRADE_CITY_CODE, TERM_IP, SUB_ORDER_ID, SUBSCRIBE_STATE, SUBSCRIBE_ID, STANDARD_KIND_CODE, SERIAL_NUMBER, REMARK, PROVINCE_CODE, PRODUCT_SPEC, PRODUCT_ID, PRIORITY, ORDER_ID, OPER_FEE, OLCOM_TAG, NEXT_DEAL_TAG, NET_TYPE_CODE, MAIN_DISCNT_CODE, IN_MODE_CODE, INVOICE_NO, IMPORT_DATE, IF_MAINTENANCE, FOREGIFT, FINISH_DATE, FEE_TIME, FEE_STATE, FEE_STAFF_ID, EXEC_TIME, CUST_NAME, CUST_ID, CONTACT_PHONE, CONTACT_ADDRESS, CONTACT, CHK_TAG, CHECK_TYPE_CODE, CANCEL_TAG, CANCEL_STAFF_ID, CANCEL_EPARCHY_CODE, CANCEL_DEPART_ID, CANCEL_DATE, CANCEL_CITY_CODE, BRAND_CODE, BPM_ID, AUDIT_TAG, AUDIT_BATCH_NO, ADVANCE_PAY, ACTOR_PHONE, ACTOR_NAME, ACTOR_CERTTYPEID, ACTOR_CERTNUM, ACCT_ID, ACCEPT_MONTH, ACCEPT_DATE, SYS_TYPE ) SELECT USER_ID, USER_DIFF_CODE, USECUST_ID, TRADE_TYPE_CODE, TRADE_STAFF_ID, TRADE_ID, TRADE_EPARCHY_CODE, TRADE_DEPART_ID, TRADE_CITY_CODE, TERM_IP, SUB_ORDER_ID, SUBSCRIBE_STATE, SUBSCRIBE_ID, STANDARD_KIND_CODE, SERIAL_NUMBER, REMARK, PROVINCE_CODE, PRODUCT_SPEC, PRODUCT_ID, PRIORITY, ORDER_ID, OPER_FEE, OLCOM_TAG, NEXT_DEAL_TAG, NET_TYPE_CODE, MAIN_DISCNT_CODE, IN_MODE_CODE, INVOICE_NO, IMPORT_DATE, IF_MAINTENANCE, FOREGIFT, FINISH_DATE, FEE_TIME, FEE_STATE, FEE_STAFF_ID, to_date(EXEC_TIME,''YYYY-MM-DD HH24:MI:SS''), CUST_NAME, CUST_ID, CONTACT_PHONE, CONTACT_ADDRESS, CONTACT, CHK_TAG, CHECK_TYPE_CODE, CANCEL_TAG, CANCEL_STAFF_ID, CANCEL_EPARCHY_CODE, CANCEL_DEPART_ID, CANCEL_DATE, CANCEL_CITY_CODE, BRAND_CODE, BPM_ID, AUDIT_TAG, AUDIT_BATCH_NO, ADVANCE_PAY, ACTOR_PHONE, ACTOR_NAME, ACTOR_CERTTYPEID, ACTOR_CERTNUM, ACCT_ID, ACCEPT_MONTH, ACCEPT_DATE, ''CBSS'' FROM t_dc_cbss_trade where to_char(ACCEPT_DATE,''YYYYMMDD'')=' || '''' ||
                 v_ddate || '''';
        -- insert into t_v_sql (v_sql) values (v_sql);
        commit;
        execute immediate v_sql;
        commit;
      end;
      commit;
      result_code := '0000';
      result_info := '存儲過程執行完成';
    exception
      when others then
        result_code := '9999';
        result_info := '存儲過程執行出錯,錯誤以下:' || sqlerrm;
        dbms_output.put_line('存儲過程執行出錯,錯誤以下:' || sqlerrm);
        rollback;
    end;複製代碼
相關文章
相關標籤/搜索