2011-11-09 13 views
2

プロシージャのWHERE句でIF/ELSEを実行しようとしていますが、正しく機能していないようです。私はそれを正しく構成しているかどうかはわかりません。PL/SQL:ORA-00933:SQLコマンドが正しく終了しません

は、私はPL/SQLを取得:ORA-00933:SQLコマンドが正常に終了しない "p_job_yearがNULLでない場合、"

これは私が持っているものです:

WHERE 
    (val1s.val1 = p_val1 OR p_val1 IS NULL) AND 
    (UPPER(val2s.val2) LIKE UPPER(p_val2) OR p_val2 IS NULL) AND 
    (jp.row_top.job_type_id = p_job_type_id OR p_job_type_id IS NULL) 

    AND ntab.group_id = pgds.id(+) 
    AND jp.row_top.val1_id = val1s.id(+) 
    AND val1s.val2_id = val2s.id(+) 

IF p_job_year IS NOT NULL THEN <<<<<<<< ERROR HERE 
      AND p_job_year = ntab.fiscal_year(+) 
      AND jp.jobload_year = p_job_year 
      AND jp.row_top.fiscal_year = p_job_year 
    ELSE 
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 


END IF; 

    AND JP.VER = (select MAX(jp2.ver) from job_plans jp2 
                WHERE JP.ID_NUMBER = JP2.ID_NUMBER) 
    AND jack_work_pkg.get_last_jack_work_first_type(jp.id) != 1;             
      RETURN result_cur; 
    END summarize_work_data; 

答えて

3

することができます」このようにIF句を使用する場合は、where句をわずかに異なるように構築する必要があります。

AND 
(
    (
     p_job_year IS NULL 
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY')   
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
    ) 
    OR 
    (
     p_job_year is not NULL 
     AND p_job_year = ntab.fiscal_year(+)    
     AND jp.jobload_year = p_job_year    
     AND jp.row_top.fiscal_year = p_job_year 
    ) 
) 
+0

こんにちは、ありがとうございました...私は打撃を与えようとしています –

+0

感謝の男...それは働いた –

0

WHERE句にIF/ELSE/END IFを書くことができると思いますか?

AND (
    (p_job_year IS NOT NULL AND (
      AND p_job_year = ntab.fiscal_year(+) 
      AND jp.jobload_year = p_job_year 
      AND jp.row_top.fiscal_year = p_job_year)) 
    OR (p_job_year IS NULL AND (
     AND jp.jobload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY') 
     AND jp.row_top.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24),'YYYY'))) 
) 
+0

ねえ男...私はw SQLのリライト...私はフロントエンドjJAVAを書く...と時々私はSQLを変更する必要があります....私はそれが間違った構造を考え出した...スマートコメントのために必要な –

+0

おい、私はドン生きるためにここに質問に答えます...私はあなたを助けようとしているので、また、時にはポイントを集めるのが好きなので:)それで、あなたが役に立つ答えを見つけたら、それをアップしてください。 – bpgergo

+0

助けてくれてありがとう...違反はしませんが、文字通り読みました...私の顔にこう言いましたか?WHERE句にIF/ELSE/END IFを書くことができると思いますか? "私は同じやり方で答えるだろう....いずれにせよ感謝 –

-1

まあ、それはあなたが思うほど単純ではない:あなたはWHERE句に追加することができます基本的に何

はこのようなものです。このように動的クエリを作成することはできません。 クエリを文字列として作成し、実行するにはexecute immediateを使用します。

0

このブロック全体がwhere句だけであると仮定しています。その場合、where節内で "IF..ELSE"を使用することはできません。代わりに、必要に応じてthis..just使用してANDとORと括弧のようなクエリを書き直す

Where condition1 
    and condition2 
    and IF Condition3 then 
     AND condition4... 
     ELSE 
      condition5 
    and <.....> 
を使用しての

Where condition1 
    and condition2 
    and ((Condition3 and condition4) or (condition5)) 
    and <.....> 
+0

ありがとう、友人... –

0

ありTHEN ELSE WHERE句内のIFノーである - しかし、あなたCASE WHEN THEN ELSEを使用して補正することができます。

関連する問題