Announcement

Collapse
No announcement yet.

Feldinhalt eines Blobfeldes erweitern um Inhalt eines anderen BlobFeldes

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

  • Feldinhalt eines Blobfeldes erweitern um Inhalt eines anderen BlobFeldes

    Hallo, Zusammen,

    ich möchte in einer Stored Procedure den Feldinhalt eines Blobfelds um den Feldinhalt eines anderen Blobfeldes erweitern.

    <pre>
    CREATE PROCEDURE IBSP_PROJEKTE_ZUSAMMENFUEHREN (iProjektFrom INTEGER, iProjektTo INTEGER)
    AS
    DECLARE VARIABLE ProjektBez BLOB SUB_TYPE TEXT;

    BEGIN
    SELECT IBDF_PROJEKT_BEZ
    FROM IBT_PROJEKT
    WHERE IBDF_PROJEKT= :iProjektFrom
    INTO :ProjektBez;


    UPDATE IBT_PROJEKT SET
    IBDF_PROJEKT_BEZ = */IBDF_PROJEKT_BEZ + */ :ProjektBez
    WHERE IBDF_PROJEKT= :iProjektTo;
    END
    <pre>

    Nur der Inhalt des neuen Feldes funktioniert mittels IBDF_PROJEKT_BEZ = :ProjektBez.

    Versuche ich es mittels + zu verketten erhalte ich einen SQL ERROR -607.

    Von Access her kenne ich das & zum verketten von Feldern. Aber für Interbase ist mir dies nicht geläufig.

  • #2
    Hallo!<br>
    Das Verkettungszeichen von IB ist ||. Ich hab aber keine Ahnung, ob es auch mit Blobfeldern geht. Guck auch mal unter "cast" nach!
    <br><br>
    Gruß M.Pannie

    Comment


    • #3
      Hallo,

      bei Blob-Feldern ist eine Verknüpfung nur mit Hilfe von UDF's möglich. Das gilt auch für Text-Blobs.

      Gruß

      Torste

      Comment


      • #4
        Also hier mal ein Ansatz.

        -> UDF

        <pre>
        function OSBLOBSVERKETTEN(ABlob, AddBlob : TBlobData ): TBlobData; cdecl;

        implementation

        function OSBLOBSVERKETTEN(ABlob, AddBlob : TBlobData): TBlobData; cdecl;
        begin
        Result := ABlob + AddBlob;
        end;
        </pre>

        -> Declare

        <pre>
        DECLARE EXTERNAL FUNCTION OSBLOBSVERKETTEN
        BLOB, BLOB
        RETURNS BLOB
        ENTRY_POINT 'OSBLOBSVERKETTEN' MODULE_NAME 'TWUDF';
        </pre>

        -> Aufruf aus SP

        <pre>
        CREATE PROCEDURE IBSP_PROJEKTE_ZUSAMMENFUEHREN (iProjektFrom INTEGER, iProjektTo INTEGER)
        AS
        DECLARE VARIABLE ProjektBezFrom BLOB SUB_TYPE TEXT;
        DECLARE VARIABLE ProjektBezTo BLOB SUB_TYPE TEXT;
        BEGIN
        SELECT IBDF_PROJEKT_BEZ
        FROM IBT_PROJEKT
        WHERE IBDF_PROJEKT= :iProjektTo
        INTO :ProjektBezTo;

        SELECT IBDF_PROJEKT_BEZ
        FROM IBT_PROJEKT
        WHERE IBDF_PROJEKT= :iProjektFrom
        INTO :ProjektBezFrom;


        UPDATE IBT_PROJEKT SET
        IBDF_PROJEKT_BEZ = OSBLOBSVERKETTEN(:ProjektBezFrom,:ProjektBezTo)
        WHERE IBDF_PROJEKT= :iProjektTo;
        END
        </pre>

        Leider funktioniert dieser Ansatz nicht.

        Ich habe auch mal CSTRING und PCHAR genommen, Dann war mein Blobfeld anschließend leer

        Comment


        • #5
          Hallo Rene,

          so einfach geht es nicht. Hier Beispielcode. Ist aber ungetestet.

          <pre>
          TISC_BlobGetSegment = function(BlobHandle: PInt;
          Buffer: PChar;
          BufferSize: Word;
          var ResultLength: Word): Short; cdecl;
          TISC_BlobPutSegment = procedure(BlobHandle: PInt;
          Buffer: PChar;
          BufferLength: Short); cdecl;
          TBlob = record
          GetSegment : TISC_BlobGetSegment;
          BlobHandle : PInt;
          SegmentCount : LongInt;
          MaxSegmentLength : LongInt;
          TotalSize : LongInt;
          PutSegment : TISC_BlobPutSegment;
          end;
          PBlob = ^TBlob;

          function F_BlobCat(Source1, Source2, Dest: PBlob): PBlob; cdecl; export;
          var
          b_len: integer;
          buffer: PChar;
          len: integer;
          Source1Assigned: Boolean;
          Source2Assigned: Boolean;
          begin
          Result := Dest;
          if Assigned(Dest) and Assigned(Dest^.BlobHandle) then begin
          Source1Assigned := (Assigned(Source1)) and (Assigned(Source1^.BlobHandle));
          Source2Assigned := (Assigned(Source2)) and (Assigned(Source2^.BlobHandle));

          b_len := 80;
          if Source1Assigned then
          b_len := Max( b_len, Source1^.MaxSegmentLength );

          if Source2Assigned then
          b_len := Max( b_len, Source2^.MaxSegmentLength );

          inc( b_len );
          buffer := StrAlloc( b_len );
          try
          if Source1Assigned then
          while ( Source1^.GetSegment( Source1^.BlobHandle, buffer, b_len, len ) <> 0 )
          do ( Dest^.PutSegment( Dest^.BlobHandle, buffer, len ) );

          if Source2Assigned then
          while ( Source2^.GetSegment( Source2^.BlobHandle, buffer, b_len, len ) <> 0 )
          do ( Dest^.PutSegment( Dest^.BlobHandle, buffer, len ) );
          finally
          StrDispose( buffer );
          end;
          end;
          end;

          DECLARE EXTERNAL FUNCTION F_BLOBCAT
          BLOB, BLOB, BLOB
          RETURNS PARAMETER 3
          ENTRY_POINT 'F_BlobCat' MODULE_NAME 'GrUDF';

          Gruß

          Torste

          Comment

          Working...
          X