Rexx: Call procedure
- Dieses Thema hat 3 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 12 Jahre, 10 Monaten von
Anonym.
-
AuthorPosts
-
25. Oktober 2010 um 17:22 Uhr #4101
AnonymInaktivHallo Kollegen,
ich suche nach einem Beispiel, wie ein Rexx Programm vom stored procedure ein Parameter übernimmt.
Ich finde kein sample program dafür in SQLLIB, und kein konkretes Beispiel im internet. Die Vorbereitungen
CALL SQLEXEC "PREPARE STATEMENT …"
CALL SQLEXEC "DESCRIBE INTO …",
sind erfolgreich, aber jede Art
CALL SQLEXEC "EXECUTE … INTO…" kehrt mit syntax error zurück, SQLCODE=-104, egal ob mit DESCRIPTOR oder host variable.
Ich versuche das unter Windows XP, mit OOrexx + DB2 ESE LUW V9.5 FP5 (aber auch DB2 WSE V9.1 FP 7).
Hat jemand einen Rat?
Danke und Gruß
Katalin
28. Oktober 2010 um 19:18 Uhr #4255
AnonymInaktivHallo Katalin,
ich kann Dir leider kein passgenaues Beispiel zu OO Rexx mit DB2 UDB V9.5 nennen, aber aus meinem Fundus ein Beispiel von Rexx mit DB2 z/OS liefern:
/*********************************************************************/
/* call DB2 stored procedure                           */
/*********************************************************************/
sqlstmt = "CALL SYSPROC.DSNACCOX",
         "(:QUERYTYPE      :QUERYTYPE_IND, " ,
         " :OBJECTTYPE      :OBJECTTYPE_IND, " ,
         " :ICTYPE        :ICTYPE_IND, " ,
...
...
LOC1 = d2x(0)
LOC2 = d2x(0)
sqlstmt = "ASSOCIATE LOCATORS (:LOC1, :LOC2)",
       "WITH PROCEDURE SYSPROC.DSNACCOX"
address DSNREXX "EXECSQL" sqlstmt;
call code 0
/*********************************************************************/
/* Allocate and process cursor-driven                     */
/*********************************************************************/
sqlstmt = "ALLOCATE C101 CURSOR FOR RESULT SET :LOC1"
address DSNREXX "EXECSQL" sqlstmt;
do while sqlcode = 0
  call code 0
  sqlstmt = "FETCH C101 INTO :RS_SEQ, :RS_DATA"
  Address DSNREXX "EXECSQL" sqlstmt;
  /*say RS_SEQ RS_DATA*/
end
call code 0 100
sqlstmt = "CLOSE C101"
ADDRESS DSNREXX "EXECSQL "sqlstmt;
call code 0 100
/*********************************************************************/
/* Allocate and process cursor-driven                     */
/*********************************************************************/
sqlstmt = "ALLOCATE C102 CURSOR FOR RESULT SET :LOC2"
address DSNREXX "EXECSQL" sqlstmt;
call Code 0
/*********************************************************************/
/* Fetch all messages via the cursor                      */
/*********************************************************************/
sqlstmt = "FETCH C102 INTO ",
            ":DBNAME        :DBNAME_IND       ,",
            ":NAME          :NAME_IND        ,",
            ":PARTITION      :PARTITION_IND     ,",
            ":INSTANCE       :INSTANCE_IND      ,",
            ":CLONE         :CLONE_IND        ,",
            ":OBJECTTYPE      :OBJECTTYPE_IND    ,",
..
..
  end
  Address DSNREXX "EXECSQL" SQLSTMT
end
call code 0 100
sqlstmt = "CLOSE C102"
address DSNREXX "EXECSQL "sqlstmt;
call code 0 100
say "*** end ***"Ich hoffe dieses Code Sniplet hilft ein wenig weiter.
Falls nicht, müsste ich noch mal tiefer in meinen Fundus schauen. Dann solltest Du aber Deinen Code hier zeigen. damit man sich konkret auf einzelne Statement beziehen könnte.
Viel Erfolg
Gernot
11. November 2010 um 12:09 Uhr #4366
AnonymInaktivHallo Gernot,
ich bekam – ob warum?? – keine email-Benachrichtigung über Deine Antwort, deswegen diese paar Tage Verspätung.
Wie ich aus dem help herauslese, DB2 LUW lässt keine Benutzung von host variables in dem CALL, anders als das mit z/OS möglich ist.
Ich habe mehrere Versuche verrichtet, die ich hier unten hineinkopiere, samt output Ergebnissen.
Wie könnte man ein parametrisiertes procedure erfolgreich rufen, interessiert mich nach wie vor…
Danke für Deine Antwort,
Katalin
callsp_list Rexx Programm:
/* callsp_list */
/* Stored procedure call, getestet:Â WIN XP + oorexx + DB2 LUW V9.5 , V9.1 *//* register DB2 */
 if RxFuncQuery(‚SQLDBS‘) <> 0 then
  rcy = RxFuncAdd( ‚SQLDBS‘, ‚db2ar‘, ‚SQLDBS’ )
 if RxFuncQuery(‚SQLEXEC‘) <> 0 then
  rcy = RxFuncAdd( ‚SQLEXEC‘, ‚db2ar‘, ‚SQLEXEC‘ )/* pull in command line arguments */
parse arg userid passwd ./* check to see if the proper number of arguments have been passed in */
  PARSE ARG dbname userid password .
  if ((dbname = "" ) | ,
    (userid <> "" & password = "") ,
    ) then do
    SAY "USAGE: callsp.cmd <dbname> [<userid> <password>]"
    exit -1
  end/* connect to database */
  SAY
  SAY ‚Connect to‘ dbname
  IF password= "" THEN
    CALL SQLEXEC ‚CONNECT TO‘ dbname
  ELSE
    CALL SQLEXEC ‚CONNECT TO‘ dbname ‚USER‘ userid ‚USING‘ password  CALL CHECKERR ‚Connect to ‚
  SAY "Connected"/* Create the CALL_TEST procedure with an OUTPUT parameter */
  call createsp/* Variatons for calling the procedure */
  do ttidx = 1 to 4
    say
    say ttidx". Try"
    call callsp ttidx
  end
exitcreatesp:
crea.1="CREATE PROCEDURE with_par ( OUT ch CHAR(1) )",
"LANGUAGE SQLÂ Â NOT DETERMINISTIC",
"P1: BEGIN SET ch=’B‘; END P1"
crea.2="CREATE PROCEDURE without_par ( )",
"LANGUAGE SQLÂ Â NOT DETERMINISTIC",
"P1: BEGIN DECLARE ch CHAR(1);Â SET ch=’B‘; END P1"
do i=1 to 2
CALL SQLEXEC ‚EXECUTE IMMEDIATE :crea.i‘
CALL CHECKERR ‚Create proc ‚
end
CALL SQLEXEC ‚COMMIT‘
returncallsp:
arg testpar
select
when testpar=1 then do
  callcomm="CALL without_par()"
 CALL SQLEXEC ‚EXECUTE IMMEDIATE :callcomm‘
 CALL CHECKERR ‚EXECUTE IMMEDIATE (Call without parameter)‘
end
when testpar=2 then do
  callcomm="CALL with_par(:ch)"
 CALL SQLEXEC ‚EXECUTE IMMEDIATE :callcomm‘
 CALL CHECKERR ‚EXECUTE IMMEDIATE (Call with host variable)‘
end
when testpar=3 then do
  callcomm="CALL with_par(?)"
 CALL SQLEXEC ‚PREPARE S61 FROM :callcomm‘
CALL CHECKERR ‚Dynamic prepare without descriptor‘
if result=0 then call disp_sqlroda ’sqlroda after prepare – if implicit used?‘Â CALL SQLEXEC ‚EXECUTE S61 INTO :ch‘
 CALL CHECKERR ‚EXECUTE (after dynamic prepare without descriptor)‘
end
when testpar=4 then do
  callcomm="CALL with_par(?)"
 CALL SQLEXEC ‚PREPARE S62 INTO :sqlroda FROM :callcomm‘
CALL CHECKERR ‚Prepare into descriptor‘
if result=0 then call disp_sqlroda ’sqlroda after prepare‘Â CALL SQLEXEC ‚DESCRIBE S62 INTO :sqlroda‘
CALL CHECKERR ‚Describe into descriptor‘
if result=0 then call disp_sqlroda ’sqlroda after describe‘Â CALL SQLEXEC ‚EXECUTE S62 INTO DESCRIPTOR :sqlroda‘
 CALL CHECKERR ‚EXECUTE into descr (after Prepare into descriptor)‘
if result=0 then call disp_sqlroda ’sqlroda after execute‘
say ‚ch=‘ ch CALL SQLEXEC ‚EXECUTE S62 INTO :ch‘
 CALL CHECKERR ‚EXECUTE into host var. (after prepare into descriptor)‘
if result=0 then call disp_sqlroda ’sqlroda after execute‘
say ‚ch=‘ ch
end
otherwise do; say ‚wrong testpar‘; exit 999; end
endreturn
disp_sqlroda:
arg out_loc
say out_loc
say ’sqlroda.sqldaid =‘ sqlroda.sqldaidÂ
say ’sqlroda.sqld   =‘ sqlroda.sqld  Â
say ’sqlroda.sqldabc =‘ sqlroda.sqldabcÂ
say ’sqlroda.1.sqltype=‘ sqlroda.1.sqltype
say ’sqlroda.1.sqllen =‘ sqlroda.1.sqllen
say ’sqlroda.1.sqldata=‘ sqlroda.1.sqldata
say ’sqlroda.1.sqlname=‘ sqlroda.1.sqlname
returnCHECKERR:
 arg errloc if ( SQLCA.SQLCODE = 0 ) then
  return 0
 else do
  say “
  say ‚— error report —‚
  say ‚ERROR occurred :‘ errloc
  say ‚SQLCODE :‘ SQLCA.SQLCODE  /******************************
  * GET ERROR MESSAGE API called *
  ******************************/
  call SQLDBS ‚GET MESSAGE INTO :errmsg LINEWIDTH 80‘
  say errmsg
  say ‚— end error report —‚  /*
  if (SQLCA.SQLCODE < 0 ) then
    exit
  else do
    say ‚WARNING – CONTINUING PROGRAM WITH ERRORS‘
    return 0
  end
  */
 end
return sqlca.sqlcodeOutput von dem Programm:
C:EclipseWorkspaceerekonz>rexx callsp_list sample
Connect to sample
Connected1. Try
2. Try
— error report —
ERROR occurred : EXECUTE IMMEDIATE (CALL WITH HOST VARIABLE)
SQLCODE : -312
SQL0312NÂ The host variable "ch" is used in a dynamic SQL statement, a view
definition, or a trigger definition. SQLSTATE=42618
— end error report —3. Try
SQLRODA AFTER PREPARE – IF IMPLICIT USED?
sqlroda.sqldaid = SQLRODA.SQLDAID
sqlroda.sqld   = SQLRODA.SQLD
sqlroda.sqldabc = SQLRODA.SQLDABC
sqlroda.1.sqltype= SQLRODA.1.SQLTYPE
sqlroda.1.sqllen = SQLRODA.1.SQLLEN
sqlroda.1.sqldata= SQLRODA.1.SQLDATA
sqlroda.1.sqlname= SQLRODA.1.SQLNAME— error report —
ERROR occurred : EXECUTE (AFTER DYNAMIC PREPARE WITHOUT DESCRIPTOR)
SQLCODE : -104
SQL0104NÂ An unexpected token "INTO" was found following "<identifier>".
Expected tokens may include:Â "END-OF-STATEMENT".
— end error report —4. Try
SQLRODA AFTER PREPARE
sqlroda.sqldaid = SQLRODA.SQLDAID
sqlroda.sqld   = 1
sqlroda.sqldabc = SQLRODA.SQLDABC
sqlroda.1.sqltype= 453
sqlroda.1.sqllen = 1
sqlroda.1.sqldata= 1208
sqlroda.1.sqlname= CH
SQLRODA AFTER DESCRIBE
sqlroda.sqldaid = SQLRODA.SQLDAID
sqlroda.sqld   = 1
sqlroda.sqldabc = SQLRODA.SQLDABC
sqlroda.1.sqltype= 453
sqlroda.1.sqllen = 1
sqlroda.1.sqldata= 1208
sqlroda.1.sqlname= CH— error report —
ERROR occurred : EXECUTE INTO DESCR (AFTER PREPARE INTO DESCRIPTOR)
SQLCODE : -104
SQL0104NÂ An unexpected token "INTO" was found following "<identifier>".
Expected tokens may include:Â "END-OF-STATEMENT".
— end error report —
ch= CH— error report —
ERROR occurred : EXECUTE INTO HOST VAR. (AFTER PREPARE INTO DESCRIPTOR)
SQLCODE : -104
SQL0104NÂ An unexpected token "INTO" was found following "<identifier>".
Expected tokens may include:Â "END-OF-STATEMENT".
— end error report —
ch= CHC:EclipseWorkspaceerekonz>
18. November 2010 um 21:30 Uhr #4445
AnonymInaktivHallo Katalin,
mir fällt zu Object REXX nun nicht mehr ein als das, was ich bereits angemerkt hatte und aus meinem z/OS REXX Fundus stammt.
Vielleicht hilft Dir das Handbuch "Object Rexx for Windows NT and Windows 95", das ziemlich alt ist aber ganz viele DB2-Beispiele enthält:
http://www.redbooks.ibm.com/redbooks/pdfs/sg244825.pdf
Ich hoffe Du findest dort Hilfe!
Viel Erfolg
Gernot
-
AuthorPosts
You must be logged in to reply to this topic.