2015-05-18 74 views
0

我正在處理某些事情。我得檢查一個字符串進行驗證。這個字符串有一個國家代碼和一個大學代碼(來自他們自己在數據庫中的表格)和一堆數字。現在我需要驗證這個字符串。我需要檢查國家代碼和大學代碼上的這個字符串,以及它是否包含數字yes或no。在Oracle中檢查字符串中的數字和字符11G

此刻我已經嘗試了很多東西。我試圖使用很多if語句,regexp_like,instr,substr,select語句和其他語句。但是我無法檢查字符串是否爲國家和大學代碼(以及它是否具有匹配的數字)。

我此刻的代碼如下:

create or replace function checkForCorrectness (
    isin varchar2) 
return integer 
as 
    isCorrect integer := 0; 
    checkISIN varchar2(50); 
    checkCountryCode country.code%type; 
    checkUniversityCode university.code%type; 

    e_onbekendeLandCode exception; 
    e_onbekendeUniCode exception; 
    e_lengteNummer exception; 
begin 
--checkISIN := isin; 
/* 
if checkISIN like '%NL%' 
then dbms_output.put_line('Beschikt over een landcode'); 
    if checkISIN like '%KTU%' 
    then dbms_output.put_line('Beschikt over een universiteit code'); 
    if checkISIN like '' 
    then dbms_output.put_line('Beschikt over een nummerreeks'); 
    end if; 
    end if; 
end if; 
*/ 
--select isin 
--into checkISIN 
--from dual 
--where regexp_like(checkISIN, '^[[:digit:]]+$'); 
isin := regexp_like(isin, '[[:digit:]]'); 
dbms_output.put_line(checkISIN); 

    return isCorrect; 

exception 
when e_lengteNummer 
then dbms_output.put_line('Foutmelding: Nummereeks is kleiner dan 9'); 

when e_onbekendeLandCode 
then dbms_output.put_line('Foutmelding: Landcode is niet geldig of bestaat niet'); 

when e_onbekendeUniCode 
then dbms_output.put_line('Foutmelding: Universiteit code is niet geldig of bestaat niet'); 

end checkForCorrectness; 
/
show errors function checkForCorrectness 
/* 
begin 
dbms_output.put_line(checkForCorrectness('NL 4633 4809 KTU')); 
end; 

此刻我很迷茫,我不知道該怎麼辦了。我希望你們中的一些人能夠幫助我。

長話短說。我得到這個校驗值(還有更多):

ASSERT_EQUALS(checkForCorrectness('NL 4633 4809 KTU'),1); 
ASSERT_EQUALS(checkForCorrectness('NL 4954 2537 7808 MSM'),1); 

輸入是包含國家代碼(NL),數字(4633 4809)和一所大學的代碼(KTU)的字符串。如果結果爲真或驗證,則返回1 else 0.

我希望我的問題不太含糊。

如果有人能向我解釋什麼樣的功能,我需要做的步驟/帶,將是真棒

在此先感謝

+0

是否所有國家代碼的兩個字符?所有的大學代碼都是三個字符?國家代碼和大學代碼之間是否有空格和數字以外的任何字符?對這些組裝方式有任何限制(即「NL 4 9 5 425 MSM」有效)?或者數字總是以4組的形式出現?您是否試圖根據查找表驗證國家和大學代碼?或者只是檢查他們分別是兩個和三個字母代碼? –

+0

國家和大學代碼可能長於2或3個字符。數字是4對必需的(直到不可能)。我不知道檢查國家和大學代碼的最佳方法是什麼,但我想從他們自己的表中檢查這兩個(如果可能的話) –

+0

好的。那麼,你想要執行的規則究竟是什麼呢?一個或多個字母,後跟一個空格,後跟一個或多個四個連續數字組,後跟一個空格,後面跟一個或多個字母?國家代碼是否可以通過閱讀第一空間解析出來,並且可以通過從最後一個空間讀取解析出大學代碼? –

回答

1

好的,我就不過你在做什麼並不很清楚也許以下可能會有所幫助。創建從數據

create table mytable as select 'NL 4633 4809 KTU' txt from dual; 

一個表,你可以使用正則表達式來了分裂的話到

SELECT REGEXP_SUBSTR (txt, '[^ ]+', 1, 1) AS part_1 
,  REGEXP_SUBSTR (txt, '[^ ]+', 1, 2) AS part_2 
,  REGEXP_SUBSTR (txt, '[^ ]+', 1, 3) AS part_3 
,  REGEXP_SUBSTR (txt, '[^ ]+', 1, 4) AS part_4 
FROM mytable; 

列,這將讓你與你的話4列拆分出來。

part1 part2 part3 part4 
NL 4633 4809 KTU 

或者您可以使用regexp和connect by語句將您的文字轉換爲行。

select REGEXP_SUBSTR (txt, '[^ ]+', 1, level) val from mytable connect by level <= regexp_count(txt,' ') + 1; 

這將給你四行

NL 
4633 
4809 
KTU 
+0

感謝您的解釋。有一點tweeking它的工作。再次感謝。而且我將你的遊戲者標記爲正確的遊戲者。乾杯 –

0

下面的SQL塊代碼可能將有助於得到你想要的輸出是什麼....

set serveroutput on 
Declare 
    vStr Varchar2(100); 
    iB Number := 0; 
Begin 
    vStr := 'NL 4633 4809 KTU'; 

    select distinct 1 
    into iB 
    from country where name = Substr(vStr,1,2); 

    if iB = 1 then 
    dbms_output.put_line('country is legit'); 
    end if; 

    select distinct 1 
    into iB 
    from university where name = Substr(vStr,length(vStr)-2,3); 

    if iB = 1 then 
    dbms_output.put_line('uni. is legit'); 
    end if; 

End; 
/
相關問題