Temporary Tables

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Anthony Robinison

    Temporary Tables

    Looking for a better way to implement this stored procedure. The issue is
    that at the end of the procedure, when you try to drop the temp table after
    you open the cursor, you get an error stating can't perform that action
    because there's a pending operation on the temp table (the cursor reading it
    I assume)

    And if you close the cursor in order to be able to drop the temp table, you
    destroy the result table.

    If anyone can think of a better way to implement this procedure without the
    need of a temp table, I'd appreciate any ideas.

    Thanks in advance!

    CREATE PROCEDURE AIM.GetRetrieva lImageDetail (IN decAIMRetrieval ID
    DECIMAL(13,0))
    ------------------------------------------------------------------------
    -- SQL Stored Procedure
    -- Original Author Date: April 7, 2004
    -- Author: Anthony
    -- Returns Image detail information for an individual AIMRetrieval.
    --
    -- April 14, 2004:
    -- Removed STATUS as a field being returned from the AIMRetrievedIte m Table
    -- Changed AvailableFlag from 'Y' and 'N' to 1 and 2 per Stephanie's code.
    --
    ------------------------------------------------------------------------
    LANGUAGE SQL
    RESULT SETS 1
    P1: BEGIN


    DECLARE GLOBAL TEMPORARY TABLE RetrievedItem
    (AIMRETRIEVEDIT EMID DECIMAL(13,0),
    ARCHIVERETRIEVA LID DECIMAL(13, 0),
    AIMDOCUMENTID VARCHAR(256),
    ARCHIVEDOCUMENT ID VARCHAR(124),
    CAPTUREDATE DATE,
    ROUTINGTRANSITN UMBER VARCHAR(9),
    MICRACCOUNTNUMB ER VARCHAR(24),
    POSTINGACCOUNTN UMBER VARCHAR(24),
    LOCATION VARCHAR(24),
    SERIALNUMBER VARCHAR(20),
    AMOUNT DECIMAL(13, 2),
    ITEMTYPE VARCHAR(20),
    SEQUENCENUMBER VARCHAR(24),
    SORRYDOCINDICAT OR VARCHAR(20),
    APPLICATIONID VARCHAR(20),
    CREDITDEBITFLAG VARCHAR(5),
    IMAGELENGTH INTEGER,
    AVAILABLEFLAG INTEGER
    ) WITH REPLACE;

    BEGIN
    DECLARE SELECT_HIGHLEVE L CURSOR WITH RETURN FOR
    SELECT
    AIM.AIMRETRIEVA L.DESCRIPTION, AIM.AIMRETRIEVA L.AIMRETRIEVALR ECEIPT,
    AIM.STATUS.STAT US
    FROM
    AIM.AIMRETRIEVA L,
    AIM.STATUS
    WHERE
    AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
    AND decAIMRetrieval ID = AIM.AIMRetrieva l.AIMRetrievalI D;

    DECLARE SELECT_CURSOR CURSOR WITH RETURN FOR
    SELECT * FROM SESSION.Retriev edItem;

    INSERT INTO SESSION.Retriev edItem
    (
    AIMRETRIEVEDITE MID ,
    ARCHIVERETRIEVA LID ,
    AIMDOCUMENTID ,
    ARCHIVEDOCUMENT ID ,
    CAPTUREDATE ,
    ROUTINGTRANSITN UMBER ,
    MICRACCOUNTNUMB ER ,
    POSTINGACCOUNTN UMBER ,
    LOCATION ,
    SERIALNUMBER ,
    AMOUNT ,
    ITEMTYPE ,
    SEQUENCENUMBER ,
    SORRYDOCINDICAT OR ,
    APPLICATIONID ,
    CREDITDEBITFLAG ,
    IMAGELENGTH
    )
    SELECT

    AIM.AIMRETRIEVE DITEM.AIMRETRIE VEDITEMID,
    AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID, AIM.AIMRETRIEVE DITEM.AIMDOCUME NTID,
    AIM.AIMRETRIEVE DITEM.ARCHIVEDO CUMENTID, AIM.AIMRETRIEVE DITEM.CAPTUREDA TE,
    AIM.AIMRETRIEVE DITEM.ROUTINGTR ANSITNUMBER,
    AIM.AIMRETRIEVE DITEM.MICRACCOU NTNUMBER,
    AIM.AIMRETRIEVE DITEM.POSTINGAC COUNTNUMBER,
    AIM.AIMRETRIEVE DITEM.LOCATION, AIM.AIMRETRIEVE DITEM.SERIALNUM BER,
    AIM.AIMRETRIEVE DITEM.AMOUNT, AIM.AIMRETRIEVE DITEM.ITEMTYPE,
    AIM.AIMRETRIEVE DITEM.SEQUENCEN UMBER, AIM.AIMRETRIEVE DITEM.SORRYDOCI NDICATOR,
    AIM.AIMRETRIEVE DITEM.APPLICATI ONID,
    AIM.AIMRETRIEVE DITEM.CREDITDEB ITFLAG,
    Length(AIM.AIMR ETRIEVEDITEM.Im ageFront)
    FROM
    AIM.AIMRETRIEVA L,
    AIM.STATUS,
    AIM.AIMRETRIEVE DITEM,
    AIM.ARCHIVERETR IEVAL,
    AIM.ARCHIVETYPE
    WHERE
    AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
    AND AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID =
    AIM.AIMRETRIEVE DITEM.ARCHIVERE TRIEVALID
    AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = AIM.ARCHIVERETR IEVAL.AIMRETRIE VALID
    AND AIM.ARCHIVERETR IEVAL.ARCHIVEID = AIM.ARCHIVETYPE .ARCHIVEID
    AND AIM.ARCHIVETYPE .ARCHIVETYPE = 'D'
    AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = decAIMRetrieval ID;

    UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 2 WHERE
    SESSION.Retriev edItem.ImageLen gth IS NULL OR
    SESSION.Retriev edItem.ImageLen gth = 0;
    UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 1 WHERE
    SESSION.Retriev edItem.ImageLen gth IS NOT NULL OR
    SESSION.Retriev edItem.ImageLen gth > 0;

    OPEN SELECT_HIGHLEVE L;
    OPEN SELECT_CURSOR;
    --CLOSE SELECT_CURSOR;
    --DROP TABLE SESSION.Retriev edItem;
    --CLOSE SELECT_HIGHLEVE L;
    --CLOSE SELECT_CURSOR;
    --BEGIN
    --DROP TABLE SESSION.Retriev edItem;
    --END;
    END;
    END P1
    _______________ ___
    Anthony Robinson


  • Knut Stolze

    #2
    Re: Temporary Tables

    Anthony Robinison wrote:
    [color=blue]
    > Looking for a better way to implement this stored procedure. The issue is
    > that at the end of the procedure, when you try to drop the temp table
    > after you open the cursor, you get an error stating can't perform that
    > action because there's a pending operation on the temp table (the cursor
    > reading it I assume)
    >
    > And if you close the cursor in order to be able to drop the temp table,
    > you destroy the result table.
    >
    > If anyone can think of a better way to implement this procedure without
    > the need of a temp table, I'd appreciate any ideas.
    >
    > Thanks in advance!
    >
    > CREATE PROCEDURE AIM.GetRetrieva lImageDetail (IN decAIMRetrieval ID
    > DECIMAL(13,0))
    > ------------------------------------------------------------------------
    > -- SQL Stored Procedure
    > -- Original Author Date: April 7, 2004
    > -- Author: Anthony
    > -- Returns Image detail information for an individual AIMRetrieval.
    > --
    > -- April 14, 2004:
    > -- Removed STATUS as a field being returned from the AIMRetrievedIte m
    > Table -- Changed AvailableFlag from 'Y' and 'N' to 1 and 2 per Stephanie's
    > code. --
    > ------------------------------------------------------------------------
    > LANGUAGE SQL
    > RESULT SETS 1
    > P1: BEGIN
    >
    >
    > DECLARE GLOBAL TEMPORARY TABLE RetrievedItem
    > (AIMRETRIEVEDIT EMID DECIMAL(13,0),
    > ARCHIVERETRIEVA LID DECIMAL(13, 0),
    > AIMDOCUMENTID VARCHAR(256),
    > ARCHIVEDOCUMENT ID VARCHAR(124),
    > CAPTUREDATE DATE,
    > ROUTINGTRANSITN UMBER VARCHAR(9),
    > MICRACCOUNTNUMB ER VARCHAR(24),
    > POSTINGACCOUNTN UMBER VARCHAR(24),
    > LOCATION VARCHAR(24),
    > SERIALNUMBER VARCHAR(20),
    > AMOUNT DECIMAL(13, 2),
    > ITEMTYPE VARCHAR(20),
    > SEQUENCENUMBER VARCHAR(24),
    > SORRYDOCINDICAT OR VARCHAR(20),
    > APPLICATIONID VARCHAR(20),
    > CREDITDEBITFLAG VARCHAR(5),
    > IMAGELENGTH INTEGER,
    > AVAILABLEFLAG INTEGER
    > ) WITH REPLACE;
    >
    > BEGIN
    > DECLARE SELECT_HIGHLEVE L CURSOR WITH RETURN FOR
    > SELECT
    > AIM.AIMRETRIEVA L.DESCRIPTION, AIM.AIMRETRIEVA L.AIMRETRIEVALR ECEIPT,
    > AIM.STATUS.STAT US
    > FROM
    > AIM.AIMRETRIEVA L,
    > AIM.STATUS
    > WHERE
    > AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
    > AND decAIMRetrieval ID = AIM.AIMRetrieva l.AIMRetrievalI D;
    >
    > DECLARE SELECT_CURSOR CURSOR WITH RETURN FOR
    > SELECT * FROM SESSION.Retriev edItem;
    >
    > INSERT INTO SESSION.Retriev edItem
    > (
    > AIMRETRIEVEDITE MID ,
    > ARCHIVERETRIEVA LID ,
    > AIMDOCUMENTID ,
    > ARCHIVEDOCUMENT ID ,
    > CAPTUREDATE ,
    > ROUTINGTRANSITN UMBER ,
    > MICRACCOUNTNUMB ER ,
    > POSTINGACCOUNTN UMBER ,
    > LOCATION ,
    > SERIALNUMBER ,
    > AMOUNT ,
    > ITEMTYPE ,
    > SEQUENCENUMBER ,
    > SORRYDOCINDICAT OR ,
    > APPLICATIONID ,
    > CREDITDEBITFLAG ,
    > IMAGELENGTH
    > )
    > SELECT
    >
    > AIM.AIMRETRIEVE DITEM.AIMRETRIE VEDITEMID,
    > AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID,
    > AIM.AIMRETRIEVE DITEM.AIMDOCUME NTID,
    > AIM.AIMRETRIEVE DITEM.ARCHIVEDO CUMENTID, AIM.AIMRETRIEVE DITEM.CAPTUREDA TE,
    > AIM.AIMRETRIEVE DITEM.ROUTINGTR ANSITNUMBER,
    > AIM.AIMRETRIEVE DITEM.MICRACCOU NTNUMBER,
    > AIM.AIMRETRIEVE DITEM.POSTINGAC COUNTNUMBER, AIM.AIMRETRIEVE DITEM.LOCATION,
    > AIM.AIMRETRIEVE DITEM.SERIALNUM BER, AIM.AIMRETRIEVE DITEM.AMOUNT,
    > AIM.AIMRETRIEVE DITEM.ITEMTYPE, AIM.AIMRETRIEVE DITEM.SEQUENCEN UMBER,
    > AIM.AIMRETRIEVE DITEM.SORRYDOCI NDICATOR,
    > AIM.AIMRETRIEVE DITEM.APPLICATI ONID, AIM.AIMRETRIEVE DITEM.CREDITDEB ITFLAG,
    > Length(AIM.AIMR ETRIEVEDITEM.Im ageFront)
    > FROM
    > AIM.AIMRETRIEVA L,
    > AIM.STATUS,
    > AIM.AIMRETRIEVE DITEM,
    > AIM.ARCHIVERETR IEVAL,
    > AIM.ARCHIVETYPE
    > WHERE
    > AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
    > AND AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID =
    > AIM.AIMRETRIEVE DITEM.ARCHIVERE TRIEVALID
    > AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = AIM.ARCHIVERETR IEVAL.AIMRETRIE VALID
    > AND AIM.ARCHIVERETR IEVAL.ARCHIVEID = AIM.ARCHIVETYPE .ARCHIVEID
    > AND AIM.ARCHIVETYPE .ARCHIVETYPE = 'D'
    > AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = decAIMRetrieval ID;
    >
    > UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 2 WHERE
    > SESSION.Retriev edItem.ImageLen gth IS NULL OR
    > SESSION.Retriev edItem.ImageLen gth = 0;
    > UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 1 WHERE
    > SESSION.Retriev edItem.ImageLen gth IS NOT NULL OR
    > SESSION.Retriev edItem.ImageLen gth > 0;[/color]

    That doesn't make a lot of sense to me. Assuming that ImageLength is 0, you
    will set the AVAILABLEFLAG to 2 in the first query (= 0) and change it
    right away to 1 in the second query (IS NOT NULL). Did you meant to
    use ... AND ... in the 2nd query?
    [color=blue]
    > OPEN SELECT_HIGHLEVE L;
    > OPEN SELECT_CURSOR;
    > --CLOSE SELECT_CURSOR;
    > --DROP TABLE SESSION.Retriev edItem;
    > --CLOSE SELECT_HIGHLEVE L;
    > --CLOSE SELECT_CURSOR;
    > --BEGIN
    > --DROP TABLE SESSION.Retriev edItem;
    > --END;
    > END;
    > END P1[/color]

    If I got this right, then the main logic of your procedure is this:

    (1) declare temp table
    (2) copy data from 5-way join to temp table
    (3) change some data in the temp table
    (4) open 1 cursor (SELECT_HIGHLEV EL) that queries the static tables
    (5) open 1 cursor (SELECT_CURSOR) that queries the temp table

    First, we can ignore step (4) because the temp table isn't needed there.

    Next, you can combine (2), (3), and (5) into a single operation and, thus,
    avoiding the temp table completely. This would be something like that:

    DECLARE select_cursor CURSOR WITH RETURN FOR
    SELECT AIM.AIMRETRIEVE DITEM.AIMRETRIE VEDITEMID,
    AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID,
    AIM.AIMRETRIEVE DITEM.AIMDOCUME NTID,
    AIM.AIMRETRIEVE DITEM.ARCHIVEDO CUMENTID,
    AIM.AIMRETRIEVE DITEM.CAPTUREDA TE,
    AIM.AIMRETRIEVE DITEM.ROUTINGTR ANSITNUMBER,
    AIM.AIMRETRIEVE DITEM.MICRACCOU NTNUMBER,
    AIM.AIMRETRIEVE DITEM.POSTINGAC COUNTNUMBER,
    AIM.AIMRETRIEVE DITEM.LOCATION,
    AIM.AIMRETRIEVE DITEM.SERIALNUM BER,
    AIM.AIMRETRIEVE DITEM.AMOUNT,
    AIM.AIMRETRIEVE DITEM.ITEMTYPE,
    AIM.AIMRETRIEVE DITEM.SEQUENCEN UMBER,
    AIM.AIMRETRIEVE DITEM.SORRYDOCI NDICATOR,
    AIM.AIMRETRIEVE DITEM.APPLICATI ONID,
    AIM.AIMRETRIEVE DITEM.CREDITDEB ITFLAG,
    Length(AIM.AIMR ETRIEVEDITEM.Im ageFront),
    -- generate the "AVAILABLE_FLAG " on the fly
    CASE
    WHEN COALESCE(Length (AIM.AIMRETRIEV EDITEM.ImageFro nt), 0) = 0
    THEN 2
    ELSE 1
    END
    FROM AIM.AIMRETRIEVA L,
    AIM.STATUS,
    AIM.AIMRETRIEVE DITEM,
    AIM.ARCHIVERETR IEVAL,
    AIM.ARCHIVETYPE
    WHERE AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID AND
    AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID =
    AIM.AIMRETRIEVE DITEM.ARCHIVERE TRIEVALID AND
    AIM.AIMRETRIEVA L.AIMRETRIEVALI D =
    AIM.ARCHIVERETR IEVAL.AIMRETRIE VALID AND
    AIM.ARCHIVERETR IEVAL.ARCHIVEID = AIM.ARCHIVETYPE .ARCHIVEID AND
    AIM.ARCHIVETYPE .ARCHIVETYPE = 'D' AND
    AIM.AIMRETRIEVA L.AIMRETRIEVALI D = decAIMRetrieval ID;

    In the above query, I packed the calculation of the AVAILABLE_FLAG in a CASE
    expression. That way, you could save at least the 2nd UPDATE operation,
    but here we don't need any UPDATE at all.

    The COALESCE function returns the first argument that is not NULL. So if
    LENGTH(...) returns NULL, then the '0' is used and the AVAILABLE_FLAG is
    set to 2. If LENGTH is already 0, then the flag is also set to 2. That
    covers both conditions from the 1st update. Consequentially , the ELSE
    branch (setting the flag to 1) is only taken if LENGTH is not NULL and if
    it is larger than 0. (I assume that my comment on the 2 UPDATE statements
    above regarding the conditions was correct...)

    --
    Knut Stolze
    Information Integration
    IBM Germany / University of Jena

    Comment

    • Knut Stolze

      #3
      Re: Temporary Tables

      Anthony Robinison wrote:
      [color=blue]
      > Looking for a better way to implement this stored procedure. The issue is
      > that at the end of the procedure, when you try to drop the temp table
      > after you open the cursor, you get an error stating can't perform that
      > action because there's a pending operation on the temp table (the cursor
      > reading it I assume)
      >
      > And if you close the cursor in order to be able to drop the temp table,
      > you destroy the result table.
      >
      > If anyone can think of a better way to implement this procedure without
      > the need of a temp table, I'd appreciate any ideas.
      >
      > Thanks in advance!
      >
      > CREATE PROCEDURE AIM.GetRetrieva lImageDetail (IN decAIMRetrieval ID
      > DECIMAL(13,0))
      > ------------------------------------------------------------------------
      > -- SQL Stored Procedure
      > -- Original Author Date: April 7, 2004
      > -- Author: Anthony
      > -- Returns Image detail information for an individual AIMRetrieval.
      > --
      > -- April 14, 2004:
      > -- Removed STATUS as a field being returned from the AIMRetrievedIte m
      > Table -- Changed AvailableFlag from 'Y' and 'N' to 1 and 2 per Stephanie's
      > code. --
      > ------------------------------------------------------------------------
      > LANGUAGE SQL
      > RESULT SETS 1
      > P1: BEGIN
      >
      >
      > DECLARE GLOBAL TEMPORARY TABLE RetrievedItem
      > (AIMRETRIEVEDIT EMID DECIMAL(13,0),
      > ARCHIVERETRIEVA LID DECIMAL(13, 0),
      > AIMDOCUMENTID VARCHAR(256),
      > ARCHIVEDOCUMENT ID VARCHAR(124),
      > CAPTUREDATE DATE,
      > ROUTINGTRANSITN UMBER VARCHAR(9),
      > MICRACCOUNTNUMB ER VARCHAR(24),
      > POSTINGACCOUNTN UMBER VARCHAR(24),
      > LOCATION VARCHAR(24),
      > SERIALNUMBER VARCHAR(20),
      > AMOUNT DECIMAL(13, 2),
      > ITEMTYPE VARCHAR(20),
      > SEQUENCENUMBER VARCHAR(24),
      > SORRYDOCINDICAT OR VARCHAR(20),
      > APPLICATIONID VARCHAR(20),
      > CREDITDEBITFLAG VARCHAR(5),
      > IMAGELENGTH INTEGER,
      > AVAILABLEFLAG INTEGER
      > ) WITH REPLACE;
      >
      > BEGIN
      > DECLARE SELECT_HIGHLEVE L CURSOR WITH RETURN FOR
      > SELECT
      > AIM.AIMRETRIEVA L.DESCRIPTION, AIM.AIMRETRIEVA L.AIMRETRIEVALR ECEIPT,
      > AIM.STATUS.STAT US
      > FROM
      > AIM.AIMRETRIEVA L,
      > AIM.STATUS
      > WHERE
      > AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
      > AND decAIMRetrieval ID = AIM.AIMRetrieva l.AIMRetrievalI D;
      >
      > DECLARE SELECT_CURSOR CURSOR WITH RETURN FOR
      > SELECT * FROM SESSION.Retriev edItem;
      >
      > INSERT INTO SESSION.Retriev edItem
      > (
      > AIMRETRIEVEDITE MID ,
      > ARCHIVERETRIEVA LID ,
      > AIMDOCUMENTID ,
      > ARCHIVEDOCUMENT ID ,
      > CAPTUREDATE ,
      > ROUTINGTRANSITN UMBER ,
      > MICRACCOUNTNUMB ER ,
      > POSTINGACCOUNTN UMBER ,
      > LOCATION ,
      > SERIALNUMBER ,
      > AMOUNT ,
      > ITEMTYPE ,
      > SEQUENCENUMBER ,
      > SORRYDOCINDICAT OR ,
      > APPLICATIONID ,
      > CREDITDEBITFLAG ,
      > IMAGELENGTH
      > )
      > SELECT
      >
      > AIM.AIMRETRIEVE DITEM.AIMRETRIE VEDITEMID,
      > AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID,
      > AIM.AIMRETRIEVE DITEM.AIMDOCUME NTID,
      > AIM.AIMRETRIEVE DITEM.ARCHIVEDO CUMENTID, AIM.AIMRETRIEVE DITEM.CAPTUREDA TE,
      > AIM.AIMRETRIEVE DITEM.ROUTINGTR ANSITNUMBER,
      > AIM.AIMRETRIEVE DITEM.MICRACCOU NTNUMBER,
      > AIM.AIMRETRIEVE DITEM.POSTINGAC COUNTNUMBER, AIM.AIMRETRIEVE DITEM.LOCATION,
      > AIM.AIMRETRIEVE DITEM.SERIALNUM BER, AIM.AIMRETRIEVE DITEM.AMOUNT,
      > AIM.AIMRETRIEVE DITEM.ITEMTYPE, AIM.AIMRETRIEVE DITEM.SEQUENCEN UMBER,
      > AIM.AIMRETRIEVE DITEM.SORRYDOCI NDICATOR,
      > AIM.AIMRETRIEVE DITEM.APPLICATI ONID, AIM.AIMRETRIEVE DITEM.CREDITDEB ITFLAG,
      > Length(AIM.AIMR ETRIEVEDITEM.Im ageFront)
      > FROM
      > AIM.AIMRETRIEVA L,
      > AIM.STATUS,
      > AIM.AIMRETRIEVE DITEM,
      > AIM.ARCHIVERETR IEVAL,
      > AIM.ARCHIVETYPE
      > WHERE
      > AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID
      > AND AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID =
      > AIM.AIMRETRIEVE DITEM.ARCHIVERE TRIEVALID
      > AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = AIM.ARCHIVERETR IEVAL.AIMRETRIE VALID
      > AND AIM.ARCHIVERETR IEVAL.ARCHIVEID = AIM.ARCHIVETYPE .ARCHIVEID
      > AND AIM.ARCHIVETYPE .ARCHIVETYPE = 'D'
      > AND AIM.AIMRETRIEVA L.AIMRETRIEVALI D = decAIMRetrieval ID;
      >
      > UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 2 WHERE
      > SESSION.Retriev edItem.ImageLen gth IS NULL OR
      > SESSION.Retriev edItem.ImageLen gth = 0;
      > UPDATE SESSION.Retriev edItem SET AVAILABLEFLAG = 1 WHERE
      > SESSION.Retriev edItem.ImageLen gth IS NOT NULL OR
      > SESSION.Retriev edItem.ImageLen gth > 0;[/color]

      That doesn't make a lot of sense to me. Assuming that ImageLength is 0, you
      will set the AVAILABLEFLAG to 2 in the first query (= 0) and change it
      right away to 1 in the second query (IS NOT NULL). Did you meant to
      use ... AND ... in the 2nd query?
      [color=blue]
      > OPEN SELECT_HIGHLEVE L;
      > OPEN SELECT_CURSOR;
      > --CLOSE SELECT_CURSOR;
      > --DROP TABLE SESSION.Retriev edItem;
      > --CLOSE SELECT_HIGHLEVE L;
      > --CLOSE SELECT_CURSOR;
      > --BEGIN
      > --DROP TABLE SESSION.Retriev edItem;
      > --END;
      > END;
      > END P1[/color]

      If I got this right, then the main logic of your procedure is this:

      (1) declare temp table
      (2) copy data from 5-way join to temp table
      (3) change some data in the temp table
      (4) open 1 cursor (SELECT_HIGHLEV EL) that queries the static tables
      (5) open 1 cursor (SELECT_CURSOR) that queries the temp table

      First, we can ignore step (4) because the temp table isn't needed there.

      Next, you can combine (2), (3), and (5) into a single operation and, thus,
      avoiding the temp table completely. This would be something like that:

      DECLARE select_cursor CURSOR WITH RETURN FOR
      SELECT AIM.AIMRETRIEVE DITEM.AIMRETRIE VEDITEMID,
      AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID,
      AIM.AIMRETRIEVE DITEM.AIMDOCUME NTID,
      AIM.AIMRETRIEVE DITEM.ARCHIVEDO CUMENTID,
      AIM.AIMRETRIEVE DITEM.CAPTUREDA TE,
      AIM.AIMRETRIEVE DITEM.ROUTINGTR ANSITNUMBER,
      AIM.AIMRETRIEVE DITEM.MICRACCOU NTNUMBER,
      AIM.AIMRETRIEVE DITEM.POSTINGAC COUNTNUMBER,
      AIM.AIMRETRIEVE DITEM.LOCATION,
      AIM.AIMRETRIEVE DITEM.SERIALNUM BER,
      AIM.AIMRETRIEVE DITEM.AMOUNT,
      AIM.AIMRETRIEVE DITEM.ITEMTYPE,
      AIM.AIMRETRIEVE DITEM.SEQUENCEN UMBER,
      AIM.AIMRETRIEVE DITEM.SORRYDOCI NDICATOR,
      AIM.AIMRETRIEVE DITEM.APPLICATI ONID,
      AIM.AIMRETRIEVE DITEM.CREDITDEB ITFLAG,
      Length(AIM.AIMR ETRIEVEDITEM.Im ageFront),
      -- generate the "AVAILABLE_FLAG " on the fly
      CASE
      WHEN COALESCE(Length (AIM.AIMRETRIEV EDITEM.ImageFro nt), 0) = 0
      THEN 2
      ELSE 1
      END
      FROM AIM.AIMRETRIEVA L,
      AIM.STATUS,
      AIM.AIMRETRIEVE DITEM,
      AIM.ARCHIVERETR IEVAL,
      AIM.ARCHIVETYPE
      WHERE AIM.AIMRETRIEVA L.STATUSID = AIM.STATUS.STAT USID AND
      AIM.ARCHIVERETR IEVAL.ARCHIVERE TRIEVALID =
      AIM.AIMRETRIEVE DITEM.ARCHIVERE TRIEVALID AND
      AIM.AIMRETRIEVA L.AIMRETRIEVALI D =
      AIM.ARCHIVERETR IEVAL.AIMRETRIE VALID AND
      AIM.ARCHIVERETR IEVAL.ARCHIVEID = AIM.ARCHIVETYPE .ARCHIVEID AND
      AIM.ARCHIVETYPE .ARCHIVETYPE = 'D' AND
      AIM.AIMRETRIEVA L.AIMRETRIEVALI D = decAIMRetrieval ID;

      In the above query, I packed the calculation of the AVAILABLE_FLAG in a CASE
      expression. That way, you could save at least the 2nd UPDATE operation,
      but here we don't need any UPDATE at all.

      The COALESCE function returns the first argument that is not NULL. So if
      LENGTH(...) returns NULL, then the '0' is used and the AVAILABLE_FLAG is
      set to 2. If LENGTH is already 0, then the flag is also set to 2. That
      covers both conditions from the 1st update. Consequentially , the ELSE
      branch (setting the flag to 1) is only taken if LENGTH is not NULL and if
      it is larger than 0. (I assume that my comment on the 2 UPDATE statements
      above regarding the conditions was correct...)

      --
      Knut Stolze
      Information Integration
      IBM Germany / University of Jena

      Comment

      Working...