在Oracle 11G中检查字符串中的数字和字符

时间:2015-05-18 19:55:23

标签: regex string oracle oracle11g numbers

我正在做点什么。我要检查一个字符串进行验证。这个字符串有一个国家代码和一个大学代码(来自他们自己在数据库中的表)和一堆数字。现在我需要验证这个字符串。我需要在国家/地区代码和大学代码上检查此字符串,是否有数字是或否。

此刻我尝试过很多东西。我试图使用很多if语句,regexp_like,instr,substr,select语句等。但我无法检查字符串的国家和大学代码(如果它有匹配的数字)。

目前我的代码如下:

Error in setcolorder(ans, c(xcols1, ycols, xcols2)) : 
  neworder is length 16 but x has 18 columns.

此刻我很困惑,我甚至不知道该怎么做。我希望你们中的一些人可以帮助我。

长话短说。我得到了这个检查值(以及更多):

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;

输入是一个字符串,其中包含国家/地区代码(NL),数字(4633 4809)和大学代码(KTU)。如果结果为true或验证结果为1,则返回0。

我希望我的问题不要太模糊。

如果有人能向我解释我需要制作/采取什么样的功能和步骤,那就太棒了

提前致谢

2 个答案:

答案 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

或者您可以使用带有connect by语句的regexp将您的单词转换为行。

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

这会给你四行

NL
4633
4809
KTU

答案 1 :(得分: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;
/