Einzelnen Beitrag anzeigen

Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
646 Beiträge
 
FreePascal / Lazarus
 
#58

AW: PDF-Dokumente in eine Datenbank oder nicht

  Alt 22. Jan 2015, 10:40
Könnte ich hierzu einmal bitte ein Beispiel bekommen wie ich so etwas zaubern kann ? So etwas habe ich schon mal benötigt aber niemals hinbekommen. Ich hoffe ich habe es richtig verstanden habe. Ich habe hier zwei Datenbanken mit jewals einer Tabelle. Nun mache ich eine Suche und wenn der Datensatz nicht in der 1. DB ist wird in der 2. DB nachgesucht. Dises geht mit einem SQL ?
hier der reale sp quelltext aus unserer BRP Software, aber du solltest schon wissen, nach welchem Blob PK du suchst, weil du den parameter id an die sp brpgetdatei übergibt. In der Spalte TEXT haben wir aber immer den Volltext aus den PDFs extrahiert, so das man darüber mit containing gut und vergleichsweise schnell beliebige Suchen kombinieren kann. Es liesse sich aber auch das ggf noch in eine andere DB auslagern, die man dann auf einer ramdisk liegen hat oder andere lustige verfahren, wie zum Beispiel n superserverinstanzen, jeweils an die cores gebunden, die jeweils nur die volltextdaten zu einem teil der gesamt db haben und so weiter, haben wir alles schon mal so gemacht. In IMG ist übrigens ein preview des pdfs, so das ich in einer vorschau zumindest schon mal die vorschau als kachel anzeigen kann, ohne einen pdf client starten zu müssen, der ja meistens auch nur eine datei zur zeit kann.

Code:
--info: diese tabelle gibt es in beiden datenbanken
CREATE TABLE DATEI (
    ID    BIGINT NOT NULL PRIMARY KEY,
    TXT   VARCHAR(80),
    TS    TIMESTAMP,
    DATEI BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
    TEXT  BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
    IMG   BLOB SUB_TYPE 0 SEGMENT SIZE 1024
);


--die proozeduren sind nur in der produktivdb

create or alter procedure BRPMOVEDATA (MAXDATE date)
as
declare variable ID bigint;
declare variable DATEI blob sub_type 0 segment size 1024;
begin
  for
    select datei.id, datei.datei
    from datei
    where datei.ts<:maxdate
    and datei.datei is not null
    into :id,:datei
  do
  begin
    execute statement ('update or insert into DATEI (ID, DATEI) values (:ID, :DATEI) matching (ID)') (ID:=ID,DATEI:=DATEI)
    on external 'brpdat';

    update datei set datei.datei=null where id=:id;
  end
end;

create or alter procedure BRPGETDATEI (
    IDX bigint)
returns (
    ID bigint,
    TXT varchar(80),
    DATEI blob sub_type 0 segment size 80,
    TS timestamp)
as
begin
  select
    datei.txt,
    datei.ts,
    datei.datei
  from datei
  where datei.id=:idx
  into :txt, :ts, :datei;
  if (datei is null) then
  execute statement ('select datei from datei where id=:id') (ID:=IDX)
    on external 'brpdat'
    into datei;
  id=idx;
  suspend;
end
brpdat ist ein serverseitiger alias in der alias.conf, der auf die archiv db verweist. das könnte auch ein connectionstring auf einen ganz anderen server sein. Mit dre Prozedur BRPMOVEDATA kannst du einen zeitpunkt festlegen, ab dem alle älteren PDFs in die archiv DB wandern. Wir rufen die per aufgabenplanung am monatsanfang auf und übertragen die dateien, die älter als 30 tage sind. vorher wird per batch und gfix die db auf readwrite und danach wieder auf readonly gesetzt.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat