Reputation: 41
I'm tring to execute query in a db2 procedure:
CREATE OR REPLACE PROCEDURE TEST (IN indbnm VARCHAR(30), IN intblnm VARCHAR(30))
LANGUAGE SQL
BEGIN
DECLARE statmnt2 VARCHAR(1000);
DECLARE VAR_COD_TIPO_ARQU CHAR(1);
DECLARE stmt1 STATEMENT;
SET statmnt2 = 'SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY';
PREPARE stmt1 FROM statmnt2;
SET VAR_COD_TIPO_ARQU = EXECUTE (stmt1);
END@
This gives following error:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0206N "STMT1" is not valid in the context where it is used. LINE
NUMBER=33. SQLSTATE=42703
What's the right way to set VAR_COD_TIPO_ARQU
with COD_TIPO_ARQU
value dynamically?
ThankYou.
Upvotes: 2
Views: 20197
Reputation: 316
Thanks @Marcos EXECUTE... INTO ...
worked.
Additionally, creating the stored proc with OUT
parameter will let you access the value set by EXECUTE... INTO ...
outside the stored proc.
CREATE OR REPLACE PROCEDURE ISH.SAMPLEPROC (OUT o_result VARCHAR(5))
specific proc_user_data_retrieval
dynamic result sets 1
reads sql data
language sql
BEGIN
DECLARE stmt varchar(5000) default null;
DECLARE VAR_X VARCHAR(5);
DECLARE stmt_final STATEMENT;
SET stmt = 'SET (?) = ('||'SELECT JOB_ROLE FROM ISH.USER_DATA LIMIT 1'||')';
PREPARE stmt_final FROM stmt;
EXECUTE stmt_final INTO VAR_X;
SET o_result = VAR_X;
END
Then call the stored proc using CALL ISH.SAMPLEPROC(?);
Upvotes: 0
Reputation: 450
I know it's been a while since this question was asked, but I found that none of the given answers worked.
@AngocA's solution was close but, as @Mani_Swetha pointed out, the EXECUTE
statement fails due to the SELECT
bit.
After searching and combining solutions around the web, this is what finally worked for me:
CREATE OR REPLACE PROCEDURE TEST (IN indbnm VARCHAR(30), IN intblnm VARCHAR(30))
LANGUAGE SQL
BEGIN
DECLARE statmnt2 VARCHAR(1000);
DECLARE VAR_COD_TIPO_ARQU CHAR(1);
DECLARE stmt1 STATEMENT;
SET statmnt2 = 'set ? = (SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY)';
PREPARE stmt1 FROM statmnt2;
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ;
END@
Note that now the executed command is a set
statement with a SELECT
inside, rather than a pure SELECT
statement. This is what makes the trick.
Upvotes: 2
Reputation: 41
Hi is it correct solutuion:
SET statmnt = 'SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY';
PREPARE stmt1 FROM statmnt;
BEGIN
DECLARE c1 CURSOR FOR stmt1;
OPEN c1;
FETCH c1 into sttmresult;
CLOSE c1;
END;
TY.
Upvotes: 2
Reputation: 7693
The problem is the way you are setting the result from the execution:
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ;
This is the complete code that is executed succefuly
CREATE OR REPLACE PROCEDURE TEST (IN indbnm VARCHAR(30), IN intblnm VARCHAR(30))
LANGUAGE SQL
BEGIN
DECLARE statmnt2 VARCHAR(1000);
DECLARE VAR_COD_TIPO_ARQU CHAR(1);
DECLARE stmt1 STATEMENT;
SET statmnt2 = 'SELECT COD_TIPO_ARQU FROM '||indbnm||'.'||intblnm||' FETCH FIRST 1 ROWS ONLY';
PREPARE stmt1 FROM statmnt2;
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ;
END@
Upvotes: 3