を封止複雑なOracle PL/SQLカーソルの論理として見られていますか?

StackOverflow https://stackoverflow.com/questions/20081

  •  09-06-2019
  •  | 
  •  

質問

立ちたいと思っていまPL/SQLコードをdenormalizeテーブルにもeaserへのお問い合わせフォームから.コードの利用一時テーブルにはいくつかの事業を統合も行から独自のテーブルです。

のロジックが記述されているとして パイプラインテーブル機能, のパターンからのリンク。のテーブル機能を使用し PRAGMA AUTONOMOUS_TRANSACTION 宣言の許可の一時テーブルの操作、またはお受けでカーソルの入力パラメータを制限するdenormalization、特定のIDの値です。

その後、作成したビューへのクエリのテーブル機能パでは、すべての可能なID値としてカーソルのその他の機能制限).

私の質問:この本当に必要ですか?てまったく[遅発性ジスキネジア、遅く簡単に達成するのと同じこんなことをしたのだろう。

時には毎回タッチPL/SQLをみていて思うのは私のタイピング方法。

更新: 私は追加のスケッチテーブルの取り扱ってみなさんのデータベースを利用しながらdenormalizationしているところと話します。のテーブル店舗の歴史は、従業員の仕事、それぞれの活性化、および(ある)を終了です。めることが可能で員を複数同時雇用などの仕事も非連続した日程です。例えば:

| EMP_ID | JOB_ID | STATUS | EFF_DATE    | other columns...
|      1 |     10 | A      | 10-JAN-2008 |
|      2 |     11 | A      | 13-JAN-2008 |
|      1 |     12 | A      | 20-JAN-2008 |
|      2 |     11 | T      | 01-FEB-2008 |
|      1 |     10 | T      | 02-FEB-2008 |
|      2 |     11 | A      | 20-FEB-2008 |

問い合わせることを一人一人がどういう仕事は非るようにします。なので、私のdenormalization機能populates一時テーブルだけでは、日付の範囲の各ジョブ、 EMP_IDs渡されたものの、カーソルを移動させます。通 EMP_IDs1 2作の

| EMP_ID | JOB_ID | START_DATE  | END_DATE    |
|      1 |     10 | 10-JAN-2008 | 02-FEB-2008 |
|      2 |     11 | 13-JAN-2008 | 01-FEB-2008 |
|      1 |     12 | 20-JAN-2008 |             |
|      2 |     11 | 20-FEB-2008 |             |

(END_DATE を可能に NULLsョンのない所定の終了日となります。)

想像がつくと思いますが、このdenormalized形がられたのがきっかけとなっていくのクエリが作成で--これまでとして伝えしましたが--が一時テーブルの中間結果(仕事の記録の活性化を行されていない終了に...ます。のパイプラインテーブル機能を生成するための一時テーブルを返却しますその行は、私は今どうやって実行するかである。

役に立ちましたか?

解決

私はもうすでに知られると思いここには利用分析の機能...

Iセットアップ試験を用いた場合:

create table employee_job (
    emp_id integer,
    job_id integer,
    status varchar2(1 char),
    eff_date date
    );  

insert into employee_job values (1,10,'A',to_date('10-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'A',to_date('13-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (1,12,'A',to_date('20-JAN-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'T',to_date('01-FEB-2008','DD-MON-YYYY'));
insert into employee_job values (1,10,'T',to_date('02-FEB-2008','DD-MON-YYYY'));
insert into employee_job values (2,11,'A',to_date('20-FEB-2008','DD-MON-YYYY'));

commit;

に使用しましたの 機能の翌日を包み込んだ全てのサブクエリでの"記録の追加、終了日があります。

select
    emp_id,
    job_id,
    eff_date start_date,
    decode(next_status,'T',next_eff_date,null) end_date
from
    (
    select
        emp_id,
        job_id,
        eff_date,
        status,
        lead(eff_date,1,null) over (partition by emp_id, job_id order by eff_date, status) next_eff_date,
        lead(status,1,null) over (partition by emp_id, job_id order by eff_date, status) next_status
    from
        employee_job
    )
where
    status = 'A'
order by
    start_date,
    emp_id,
    job_id

私が一部使用の場合私は見逃しでご利用いただけます。いかねます。解析機能をご友人:)

EMP_ID   JOB_ID     START_DATE     END_DATE            
  1        10       10-JAN-2008    02-FEB-2008         
  2        11       13-JAN-2008    01-FEB-2008         
  2        11       20-FEB-2008                              
  1        12       20-JAN-2008                              

他のヒント

そこは、どのような事業をいとな入力パラメータとしてカーソルをこのテーブル変数いる場合OracleはそんなもんTSQLん)または移植別の温度テーブルのIDの値を入れの機能はどこでも必要があります。

唯一の時間のためにカーソルを私の率直な意見できるのだ してい へループを実行します。やるだけ"というニーズに対してはループをいつもお勧めい外部のデータベースのアプリケーションロジック.

そのようなまろにあ読みの整合性ここでie:このコンテンツのインデックスファイルを出なければいけないので同期とソースデータの場合での同時変更データの修正。

にわからない要件も複雑化していく。私の試み

  1. 決定を含むもの(複合体)の論理アプリケーションでかん追加PL/SQLをミックス、
  2. るパイプラインテーブル機能が利用のSQLコレクション型ではなく一時的ます。簡単な例はこちら: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4447489221109

2号だと少し、可動部の解決を一貫性の問題です。

Mathewバトラー

問題はここでは、"書き込み専用の"テーブルデザインによる意味でのデータを挿入しですがトリッキーや非効率に有益な情報を収集することを意図したもの。の"一時的"テーブルの構造を"永続"を表していたが。

きょうこ

  • を恒久的なテーブルの構造
  • 移植でのデータのテーブル
  • を定義するデータベースのトリガのテーブルに新しいテーブルに同期から

それだけから選択し、新しいテーブルをご報告といいます。

かおりHollyStyles.私の場でもありまTSQLろにあOracleの特殊性は少なくないだろう使い残念ながら、温度のテーブルなどの便利なOracle、この場合、その他の既存のSQL論理を見直接クエリーテーブルだから、できるだけでこのビューです。くありませんアプリケーションロジックに存在する以外のデータベースがあります。

Oracle開いう利用カーソルにより熱心にしていた以上になると思っていましたが.さらに感染症に関する正確かつ迅速&規律の自然PL/SQL,ことになるすべての驚きです。

最も単純な解決には:

  1. の作成 グローバルブ を含むだけでIdに必要なもの:

    CREATE GLOBAL TEMPORARY TABLE tab_ids (id INTEGER)  
    ON COMMIT DELETE ROWS;
    
  2. 移植の臨時テーブルのIdがあります。

  3. 利用が存在する操作でお手続きを選択している行のId表

      SELECT yt.col1, yt.col2 FROM your\_table yt  
       WHERE EXISTS (  
          SELECT 'X' FROM tab_ids ti  
           WHERE ti.id = yt.id  
       )
    

きのカンマで区切られた文字列のIdとして機能パラメータ構文解析します。これによって、シングルを選択します。のことをもっと知りたいという方-方法:-)となってきて別の質問です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top