Search code examples
stored-proceduresdb2ibm-midrange

DB2 SQL procedure - Calling initiate procedure before declaration


I am making an sql procedure (in lib EXTLIB) that will be called from an external system using JDBC. We have a user, EXTUSER, that is used for running all requests coming from there. The problem is that this user can only have a single starting library, which in our case is EXTLIB (if anyone knows how to add more, please do tell me and become a hero in my company). We have a procedure initiate that initiates the environment (i.e. adds all necessary libs to LIBL). This needs to be called at the start of all procedures in EXTLIB.

My procedure needs to fetch data from a view in our internal lib: INTERLIB. The problem is that we are using ARCAD for version/release/everything management, and ARCAD doesn't like qualifiers, so it automatically removes them, meaning that the declaration at the start can't find the view in INTERLIB, and thus it stops before reaching the initate call.

I need a way to run the call before the declaration, while retaining the functionality. I'm also open to any other alternative solutions. The only one I can think of is instead coding it in RPG, but we have a lot of simple procedures for which that would just be a waste of time. manually creating the procedure in STRSQL is not an option, because when ARCAD transfers a version to production it will recompile everything, thus removing any manual qualifiers we have put there.

Here's the code:

CREATE PROCEDURE MyProcedure ()
  LANGUAGE SQL
  SPECIFIC MYFILE
  CALLED ON NULL INPUT
  DYNAMIC RESULT SETS 1
BEGIN

  declare c1 cursor with return to client for
    select
      id,
      required
    from INTERLIB.cus_CustomerPurpose_v3_0

  call INITIATE();

  open c1;

  call DEINITIATE();
END;  

Solution

  • I think you have two options:

    1) To create an internal block in the stored procedure,

    CREATE PROCEDURE MyProcedure ()
      LANGUAGE SQL
      SPECIFIC MYFILE
      CALLED ON NULL INPUT
      DYNAMIC RESULT SETS 1
    BEGIN
      call INITIATE();
      BEGIN
        declare c1 cursor with return to client for
          select
            id,
            required
          from INTERLIB.cus_CustomerPurpose_v3_0;
        open c1;
      END;
      call DEINITIATE();
    END @
    

    2) To call another stored procedure

    CREATE PROCEDURE MyProcedure ()
      LANGUAGE SQL
      SPECIFIC MYFILE
      CALLED ON NULL INPUT
      DYNAMIC RESULT SETS 1
    BEGIN
      call INITIATE();
      call another_SP();
      call DEINITIATE();
    END @