2015-07-24 16 views
5

Geçmiş tabloları olan bir veritabanına dayanan bir SQL görünümü oluşturmak istiyorum.Geçmiş tablolarına dayalı bir görünüm oluşturma

Bunu yapmak için en iyi çözüm (hızlı ve verimli) hangisidir. Uygulamayı oluşturmadım ve veritabanı tablolarını güncelleyemiyorum. Sadece görünümler oluşturabilirim.

başvurum sözleşmelerini yönetir: Burada

bağlamıdır. Bir sözleşmenin genel bilgileri vardır ve kişiler, yasal referanslar ve portföyler ile bağlantılıdır. Bir güncelleme yapıldığında, geçmiş tablolarına yeni bir satır eklenir (yeni ID_HIST). Kişiler, yasal referanslar veya portföylerde bir güncelleme yapıldıysa, sözleşme_HIST tablosunda (aynı ID_HIST ile) yeni bir satır eşit olarak eklenir. Belirli için her yeni güncelleme için Böylece

enter image description here

(:

Amacım gibi önceki kimliği HIST kıyasla bir sıra (ID HIST) üzerinde yapılan güncellemeler görüntülemek amacıyla yaratılmasıdır Tarih HIST ile verilen tarih aranıyor), genel bilgilerin, kişilerin, yasal referansların ve/veya portföylerin güncellenip güncellenmediğini görebiliriz. İşte veritabanının yapısı aşağıda

: tablo bir veya birkaç Potföyüne İşte

enter image description here

enter image description here

aynı güncelleme için bir sözleşme atanabilir.

Bilgi için: örneğin, yeni bir güncelleştirme sırasında, bir sözleşme için kişilerin silinmiş olması durumunda, bu sözleşme için yeni bir satır (yeni bir ID_HIST ile) contract_hist dosyasına eklenir. . Yasal referans ve portföyler için aynıdır. İşte

görünüm göstermesi gerekir:

İşte test için veritabanı için komut

enter image description here

: Burada

-------------------------------------------------------- 
-- DDL for Table CONTACT_HIST 
-------------------------------------------------------- 

    CREATE TABLE "CONTACT_HIST" 
    ( "ID_HIST" NUMBER, 
    "ID_CONTRAT" NUMBER, 
    "NAME_CONTACT" VARCHAR2(20 BYTE) 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ; 
REM INSERTING into BO.CONTACT_HIST 
SET DEFINE OFF; 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (1,1,'Bernard'); 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (1,1,'Jean'); 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (2,1,'Nicolas'); 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (2,1,'Jean'); 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (3,2,'Nicolas'); 
Insert into BO.CONTACT_HIST (ID_HIST,ID_CONTRAT,NAME_CONTACT) values (5,2,'Nicolas'); 

-------------------------------------------------------- 
-- DDL for Table CONTRAT_HIST 
-------------------------------------------------------- 

    CREATE TABLE "BO"."CONTRAT_HIST" 
    ( "ID_HIST" NUMBER, 
    "DATE_CREATION" DATE, 
    "ID_CONTRAT" NUMBER, 
    "TITRE_CONTRAT" VARCHAR2(250 BYTE), 
    "DESCRIPTION" VARCHAR2(250 BYTE), 
    "BUDGET" NUMBER 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ; 
REM INSERTING into BO.CONTRAT_HIST 
SET DEFINE OFF; 
Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (1,to_date('01-JAN-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',20000); 
Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (2,to_date('15-JAN-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',50000); 
Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (3,to_date('02-FEB-15','DD-MON-RR'),2,'Contrat 2 ','Contrat Santé ',10000); 
Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (4,to_date('01-MAR-15','DD-MON-RR'),2,'Contrat 2 ','Contrat Consommateur ',30000); 
Insert into BO.CONTRAT_HIST (ID_HIST,DATE_CREATION,ID_CONTRAT,TITRE_CONTRAT,DESCRIPTION,BUDGET) values (5,to_date('01-JUL-15','DD-MON-RR'),1,'Contrat 1 ','Contrat Informatique ',50000); 
-------------------------------------------------------- 
-- DDL for Index CONTRAT_HIST_PK 
-------------------------------------------------------- 

    CREATE UNIQUE INDEX "BO"."CONTRAT_HIST_PK" ON "BO"."CONTRAT_HIST" ("ID_HIST") 
    PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ; 
-------------------------------------------------------- 
-- Constraints for Table CONTRAT_HIST 
-------------------------------------------------------- 

    ALTER TABLE "BO"."CONTRAT_HIST" ADD CONSTRAINT "CONTRAT_HIST_PK" PRIMARY KEY ("ID_HIST") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ENABLE; 
    ALTER TABLE "BO"."CONTRAT_HIST" MODIFY ("ID_HIST" NOT NULL ENABLE); 

-------------------------------------------------------- 
-- DDL for Table LEGAL_REFERENCE_HIST 
-------------------------------------------------------- 

    CREATE TABLE "BO"."LEGAL_REFERENCE_HIST" 
    ( "ID_HIST" NUMBER, 
    "ID_CONTRAT" NUMBER, 
    "LEG_REF_NAME" VARCHAR2(250 BYTE) 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ; 
REM INSERTING into BO.LEGAL_REFERENCE_HIST 
SET DEFINE OFF; 
Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (1,1,'45 - Technologies et Systeme d''Information'); 
Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (2,2,'105 - Consommateur et Santé'); 
Insert into BO.LEGAL_REFERENCE_HIST (ID_HIST,ID_CONTRAT,LEG_REF_NAME) values (5,1,'27 - Services'); 

-------------------------------------------------------- 
-- DDL for Table PORTFOLIO_HIST 
-------------------------------------------------------- 

    CREATE TABLE "BO"."PORTFOLIO_HIST" 
    ( "ID_HIST" NUMBER, 
    "ID_CONTRAT" NUMBER, 
    "PORTFOLIO_ID" NUMBER, 
    "PORTFOLIO_NAME" VARCHAR2(250 BYTE), 
    "PORTFOLIO_VALUE" NUMBER 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "RAM" ; 
REM INSERTING into BO.PORTFOLIO_HIST 
SET DEFINE OFF; 
Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (2,1,1,'Portfolio 1',5000); 
Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (2,1,2,'Portfolio 2',7000); 
Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (4,2,1,'Portfolio 1',2000); 
Insert into BO.PORTFOLIO_HIST (ID_HIST,ID_CONTRAT,PORTFOLIO_ID,PORTFOLIO_NAME,PORTFOLIO_VALUE) values (4,2,2,'Portfolio 2',8000); 
commit; 
+2

Bunun dışında bir [skeç] (http://sqlfiddle.com) yapabilir misiniz? –

+0

Merhaba coeurdange57, benim önerdiğim çözümden ne haber? yardımcı oldu mu ?? –

cevap

1

biz gitmek:

ilk: oluşturmak kayıtlı bir işlev (veya bir paketteki bir işlev) ke bu:

create or replace function test_history(i_contract_id in number, 
             i_date_created in date, 
             i_type   in varchar2) 
    return varchar2 is 
    l_sql varchar2(1000); 
    l_result number; 
begin 
    l_sql := 'select 1 from test_history_tb where id_contract = :1 and date_creation = :2 and ' || 
      i_type || ' = :3 and rownum = 1'; 
    execute immediate l_sql 
    into l_result 
    using i_contract_id, i_date_created, 'update'; 

    return('update'); 

exception 
    when no_data_found then 
    return('no_update'); 
end; 

ikinci: her satır için bir işlev çağrısı var çünkü

create view xxx as 

select id_contract, date_creation, 
     test_history(a.id_contract, a.date_creation, 'general_info') general_info, 
     test_history(a.id_contract, a.date_creation, 'contract') contract, 
     test_history(a.id_contract, a.date_creation, 'legal') legal, 
     test_history(a.id_contract, a.date_creation, 'portfolio') portfolio 
from test_history_tb a 
group by a.id_contract, a.date_creation; 

bu çözüm, bu kadar hızlı değildir: fonksiyonuna dayalı sorgu oluşturmak. Ancak verileri bir yan cümleye göre filtrelerseniz alternatif olabilir. Tabloda

örnek veriler: enter image description here

...ve görünümdeki sorgu şu şekilde görünür: enter image description here

+0

Seçtiğiniz ifadede çağıran bir işlev içinde dinamik sql kullanmak için Twisted hack. İzin verildiğini bile bilmiyordum. –

+0

Bunu çok nadiren ve yalnızca performans nedeniyle daha az veri içeren tablolarda (veya bir yan tümce) kullanırım. –

İlgili konular