2016-09-01 9 views
0

入力を要求するスクリプトを作成しようとしていますが、指定された入力が19文字であることを検証する必要があります。最初の3文字は16文字(アルファベットと数字)...PL/SQL文字列の検証

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; 

予想される出力:

ABC5678GVTC438755RW43 - correct 
ADSE4NJ8GGFT5FVNOKNHY - incorrect 
+0

コードが「正しい」か「正しくない」のいずれかを書き出すように見える - どのように予想される出力は、あなたが下に表示された文字列のいずれかになりますコード?あなたが意味するものを明確にしてください。 – mathguy

答えて

0

あなた比較文字列は16文字、長いABCと13アンダースコアです。あなたの仕様に従ってABCに従うには16のアンダースコアが必要です。

編集:下記のHepCノートでは、アンダースコアの数を修正した後でも、間違った回答が得られる可能性があります。これは、アンダースコアがアルファまたは数字だけでなく、任意の文字を表すためです。これは評価

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

かのようにTRUEとchk_varは、文字列の先頭(^マーカー)

  • 文字A、Bから

    • と一致する場合にのみ:

      代わりにこれを試してみてください、Cの順番で

    • 任意のアルファまたは数字(外側の[...]はリスト内の[...]内で提供される任意の単一の文字を意味し、内部では[:alnum:]はアルファまたは
    • 正確に16個の「単一アルファベット文字」(16文字は異なる可能性があります)(16個のマーカー)
    • とその直後の文字列の最後($マーカー)。

    サンプルSQL * Plusセッション(スクリーンショット):

    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

    これは良い気晴らしです。しかし、末尾の16文字を英数字にする必要がある場合、 'LIKE'比較を展開することはまだ不十分です。代わりに、単純な正規表現を書くことを検討するかもしれません。 –

    +0

    err ... right、私は提供されたコードで何が間違っていたかを指摘しましたが、ELSEが間違っているとは考えていませんでした。 – mathguy

    +0

    ご回答いただきありがとうございます。私はまだ期待された結果を得ていません。しかし、エラーはありませんが、無限の数字を印刷しているだけです。 – Lisa

    関連する問題