2010-12-03 8 views
1

Oracleストア・プロシージャおよびファンクションの作成を自動化する作業を現在行っています ストア・プロシージャの作成プロセスを自動化するためにJavaを使用しています。以下のための手続きを生成します:Oracle Storeプロシージャ自動化

を削除
  • 更新
  • を挿入
  • を選択

    と3つのすべての入力がnullでない場合、私は、クエリがすべきヌルとしてi_emp_id渡した場合、それは

    select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 
    

    のように機能しなければならない

    select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 
    

    のためのテキストファイルに配置しますfunction like

    select * from emp where emp_nm=i_emp_nm and emp_dpt=i_emp_dpt 
    

    if i pa ssは、クエリは、更新のためのと似て

    select * from emp where emp_nm=i_emp_nm 
    

    のように機能しなければならないヌルのようにヌルとi_emp_dpt i_emp_idなど私はあなたが私に 挿入を選択し ためのいくつかの一般的な問い合わせをお願いすることができalready posted a question on this

    を持っていた

    更新 と削除

    私のストアの手順への入力は、nullまたは実際の値と異なる場合があります

  • 答えて

    3

    テーブルAPIの問題は問題です。一方では、SQL文がアプリケーション全体に埋め込まれるのを防ぐことができます。一方で、彼らは開発者がデータベースの真の理解を得ることができないので、貧しい実践の文化につながる可能性があります。

    いずれにせよ、これはあなたが噛み砕いている巨大な作品です。 Oracle、SQL、PL/SQLの理解を深めるためには、それを正しく理解する必要があります。そして、不完全な解決策は役に立たないでしょう。おそらく役に立たないより悪い。

    だから、あなた自身では書かないでください。主要なPL/SQLの専門家Steven Feuersteinは、テーブルAPIを生成する洗練されたユーティリティ、Quest Code Generation Utility(旧QNXO)を作成しました。クエストサイトは無料です。 Find it here。それはJavaで書かれていませんが、何ですか?

    +0

    しかし、私の知識と理解のために、私はこれらのことを知る必要があります。 urリンクありがとうございます – Aravind

    +0

    @Aravind - しかし、最初に、取得した応答を評価するためにOracle SQLを十分理解しておく必要があります。私があなたの他の質問に答えてくれた点はどれですか。 – APC

    0

    あなたが望むものが有用かどうかは分かりませんが、挿入、更新、削除の文を生成したい場合は、ビューall_tab_columnsとuser_tab_columnsを知っておくと良いでしょう。インサートの

    例:

    select 'insert into ' || :table_name || ' (' qry 
    from dual 
    union all 
    select column_name || ', ' 
    from user_tab_columns 
    where table_name = :table_name 
    union all 
    select ') values (' 
    from dual 
    union all 
    select ':' || column_name || ', ' 
    from user_tab_columns 
    where table_name = :table_name 
    union all 
    select ')' 
    from dual 
    
    -1

    これを解決する方法はたくさんあります。

    argsの数と種類に応じて、1つの解決策がoverload different codeになります。

    別の解決策は、ヌルでフィルタパラメータの固定セットを使用していないことです

    ....

    select * 
    from emp 
    where emp_id=NVL(i_emp_id, emp_id) 
    and emp_nm=NVL(i_emp_nm, emp_nm) 
    and emp_dpt=NVL(i_emp_dpt, emp_dpt); 
    

    それとも、PL/SQL内の文字列としてクエリを作成し、「IMMEDIATE EXECUTE」を使用することができ....

    PROCEDURE finder (
         i_emp_id IN emp.emp_id%TYPE, 
         i_emp_nm IN emp.emp_nm%TYPE DEFAULT NULL, 
         i_emp_dpt IN emp.emp_dpt%TYPE DEFAULT NULL, 
         .... 
        ) 
    IS 
        l_qry VARCHAR2(1000) := 'SELECT * FROM emp WHERE 1=1'; 
    BEGIN 
        IF (i_emp_nm IS NOT NULL) 
        THEN 
         l_qry := l_qry || ' AND emp_nm=' || i_emp_nm; 
        IF (i_emp_dpt IS NOT NULL) 
        THEN 
         l_qry := l_qry || ' AND emp_dpt=' || i_emp_dpt; 
        EXECUTE IMMEDIATE l_qry; 
    .... 
    
    +0

    両方の提案された解決策は悪い習慣を表します。プレディケートされた列のいずれかにnullが含まれている場合、最初の列は誤った結果を返します。 2つ目はバインド変数を使用しないため、OLTPシステムでパフォーマンスが非常に悪くなる可能性があります。適切なアプローチについてのAravindの他の質問に対する私の答えを見てください。 – APC

    関連する問題