Announcement

Collapse
No announcement yet.

Kontrollierte Select Transaction

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kontrollierte Select Transaction

    Hallo Herr Kosch,
    suche schon seit längerem nach einer Lösung.
    Es geht um eine gut funktionierende Transactionskontrolle bei Select - Zugriffen.
    Grundkonzept sollte sein : Bei Verwendung von DBGrids werden max. 15 DS in eine
    MemTable eingelesen. Nach dem Einlesen wird die Transaction sofort per Commit geschlossen.
    Schreibzugriffe (Änderungen an Einzelsätzen) werden grundsätzlich über TIBSQL per Commit
    an den Server übertragen. Um die Navigation im Datenbestand zu erleichetern, wird dem User
    angeboten, Filter über Where - Klauseln zu setzen und/oder Sortierungen mittels "order by"
    vorzunehmen. Damit beginn mein Problem : Solange die Hauptabfrage nur in einer Sortierung
    vorliegt, ist es relativ einfach, über z.B einen in einer Procedure implementierten Zähler
    die nächsten oder vorherigen 15 DS einzulesen. Wie bekomme ich es aber geregelt, genau die
    nächsten oder auch vorherigen 15 DS einzulesen, wenn sich die where - Bedingung oder auch
    die order by - Bedingung ändert. Die Anzahl der gefetchten DS kann ich über 'loadlimit'
    einstellen. Ich suche also nur nach einer Lösung für den richtigen Aufsatzpunkt der
    "Anschluß" - Abfrage. Bisher lasse ich alle DS über das Select in die Memtable
    laufen. Das kann natürlich langfristig keine Lösung sein, weil die Performance
    ist bescheiden.

    Gruß
    DieGel

  • #2
    Hallo,

    in diesem Fall würde ich die Daten über eine Stored Procedure abfordern. Dort kann man über eine interne Schleife die Anzahl und die Position der Datensätze bestimmen, die zum Client transportiert werden sollen. Ich meinem Archiv habe ich nur 2 SPs, die die ersten X- bzw. die letzten X-Datensätze zurückliefern. Die SP sollte aber problemlos so erweiterbar sein, damit Datensätze aus der Mitte abgerufen werden können. Nur dann, wenn die Stored Procedure <b>Suspend</b> aufruft, liefert der InterBase den aktuellen Datensatz der Ergebnismenge der SELECT-Abfrage beim Client ab:
    <pre>
    CREATE PROCEDURE GetFirstXKunden (rows INTEGER)
    RETURNS (kundenid INTEGER, vorname CHAR(35), nachname CHAR(35)) AS
    BEGIN
    IF (rows <1) THEN EXIT;
    FOR SELECT kundenid, vorname, nachname
    FROM kundenimp
    INTO :kundenid, :vorname, :nachname
    DO
    BEGIN
    SUSPEND;
    rows = rows -1;
    IF (rows <1) THEN EXIT;
    END
    END
    ^
    </pre>
    Die im Beispiel gezeigte Stored Procedure liefert nur die ersten X Datensätze zurück, wobei die Anzahl der zurückzuliefernden Datesätze als Parameter übergeben wird:
    <pre>
    SELECT * FROM GetFirstXKunden(10)
    </pre>
    Das Gegenstück geht natürlich aus - die folgende Procedure liefert die letzten X Kunden zurück:
    <pre>
    /* Anw.-Begrenzer ist ^ */
    CREATE PROCEDURE GETLASTXKUNDEN (KUNDENID INTEGER, ROWS INTEGER)
    RETURNS (VORNAME CHAR(35),NACHNAME CHAR(35))
    AS
    DECLARE VARIABLE iREC_COUNT INTEGER;
    DECLARE VARIABLE iCOUNT INTEGER;
    DECLARE VARIABLE iSTART_FROM INTEGER;
    BEGIN
    /* Wie viele Daten sind vorhanden? */
    SELECT COUNT(*)
    FROM kundenimp
    INTO :iREC_COUNT;
    /* Wo anfangen? */
    IF (ROWS >= iREC_COUNT) THEN
    iSTART_FROM = 1;
    ELSE
    iSTART_FROM = iREC_COUNT - ROWS + 1;
    /* Counter setzen */
    iCOUNT = 0;
    /* SQL-Abfrage aufbauen */
    FOR SELECT kundenid, vorname, nachname
    FROM kundenimp
    ORDER BY kundenid
    INTO :kundenid, :vorname, :nachname
    DO
    BEGIN
    iCOUNT = iCOUNT + 1;
    IF (iCOUNT >= iSTART_FROM) THEN
    BEGIN
    SUSPEND;
    END
    END
    END
    ^
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,
      zunächst danke ! Ich kenne die beiden Proc's bereits aus Ihren Büchern zum Interbase. Das Handling mittels Proc's stellt für mich auch nicht das Problem dar. Es gibt jedoch keine mir bekannte Möglichkeit, das Select innerhalb einer kompilierten Procedure zu modifizieren. Ich kann also weder die Feldbezüge einer where - noch einer group by - Klausel in der Proceure ändern. Lösung wäre ( wenn auch eine schlechte ) alle Kombinationen für where - und group by - Klauseln in separaten Proc's unterzubringen oder gibt es da doch noch eine andere Lösung ?

      Gruß
      Diege

      Comment

      Working...
      X