2016-09-01 1 views
0

Ich versuche ein Skript zu schreiben, das nach einer Eingabe fragt, und es sollte validieren, ob die gegebene Eingabe 19 Zeichen hat, die ersten 3 Zeichen müssen 'ABC' gefolgt von 16 Zeichen sein (Kombination von Alphabeten und Zahlen) ...PL/SQL String Validierung

def mch_id='&1' 

declare 
chk_var varchar2(200) := '&mch_id'; 
begin 
    IF chk_var like'ABC_____________' then 
     dbms_output.put_line('correct'); 
    else 
     dbms_output.put_line('incorrect'); 
    end if; 
end; 

Erwartete Ausgabe:

ABC5678GVTC438755RW43 - correct 
ADSE4NJ8GGFT5FVNOKNHY - incorrect 
+0

Der Code zu schreiben, entweder ‚richtig‘ oder ‚falsch‘ scheint - wie die erwartete Ausgabe entweder der Strings können Sie unten die zeigen, Code? Bitte klären Sie, was Sie meinen. – mathguy

Antwort

0

Ihre Vergleichsstring nur 16 Zeichen lang, ABC und 13 Unterstrichen ist. Sie benötigen 16 Unterstriche, um ABC gemäß Ihrer Spezifikation zu folgen.

BEARBEITEN: Wie HepC Notizen unten, auch nach dem Festlegen der Anzahl der Unterstriche, können Sie immer noch falsche Antworten erhalten. Dies liegt daran, dass der Unterstrich für ein beliebiges Zeichen steht, nicht nur für Alpha oder Numerisch.

Versuchen Sie stattdessen:

... if regexp_like(chk_var, '^ABC[[:alnum:]]{16}$') then... 

Dies als TRUE ausgewertet, wenn und nur wenn chk_var Spiele

  • vom Anfang der Zeichenfolge (die^Marker)
  • die Buchstaben A, B , C in der Reihenfolge
  • jedes alphabetische oder numerische Zeichen (das äußere [...] bedeutet jedes einzelne Zeichen in der Liste innerhalb von [...]; darin ist [: alnum:] eine Abkürzung für jedes Alpha oder numerisches Zeichen)
  • genau 16 Vorkommen "eines einzelnen Alnum - Zeichens" (die 16 Zeichen können sich voneinander unterscheiden) (der Marker {16})
  • und das Ende des Strings gleich danach (der $ marker)).

Beispiel SQL * Plus-Sitzung (Screenshot):

SQL> set serveroutput on 
SQL> define mch_id = 'ABC1234567812345678' 
SQL> declare 
    2 chk_var varchar2(200) := '&mch_id'; 
    3 begin 
    4  if regexp_like(chk_var, '^ABC[[:alnum:]]{16}$') then 
    5   dbms_output.put_line('correct'); 
    6  else 
    7   dbms_output.put_line('incorrect'); 
    8  end if; 
    9 end; 
10/
old 2: chk_var varchar2(200) := '&mch_id'; 
new 2: chk_var varchar2(200) := 'ABC1234567812345678'; 
correct 

PL/SQL procedure successfully completed. 

SQL> define mch_id = 'ABC123456781234%%%%' 
SQL>/
old 2: chk_var varchar2(200) := '&mch_id'; 
new 2: chk_var varchar2(200) := 'ABC123456781234%%%%'; 
incorrect 

PL/SQL procedure successfully completed. 
+0

Dies ist eine gute Beobachtung. Wenn die abschließenden 16 Zeichen jedoch alphanumerisch sein müssen, ist die Erweiterung des "LIKE" -Vergleichs immer noch nicht ausreichend. Sie könnten stattdessen einen einfachen regulären Ausdruck schreiben. –

+0

err ... richtig, ich habe nur darauf hingewiesen, was im Code falsch war, aber habe nicht darüber nachgedacht, was ELSE falsch sein könnte. – mathguy

+0

Danke für Ihre Antwort. Ich bekomme immer noch nicht das erwartete Ergebnis .. Es gibt jedoch keinen Fehler, aber es ist nur unendliche Zahlen ausdrucken. – Lisa