我正在尝试在db2过程中执行查询:
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@
这会出现以下错误:
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
动态设置VAR_COD_TIPO_ARQU
COD_TIPO_ARQU
的正确方法是什么?
THANKYOU。
答案 0 :(得分:3)
问题在于您从执行中设置结果的方式:
EXECUTE stmt1 into VAR_COD_TIPO_ARQU ;
这是成功执行的完整代码
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@
答案 1 :(得分:2)
嗨,这是正确的解决方案:
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。
答案 2 :(得分:0)
我知道自问这个问题以来已经有一段时间了,但我发现没有一个给定的答案有效。
@ AngocA的解决方案很接近但是,正如@Mani_Swetha指出的那样,EXECUTE
语句由于SELECT
位而失败。
在网络上搜索并整合解决方案之后,这最终对我有用:
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@
请注意,现在执行的命令是set
语句,其中包含SELECT
,而不是纯SELECT
语句。这就是诀窍。
答案 3 :(得分:0)
感谢@Marcos EXECUTE... INTO ...
的工作。
此外,使用OUT
参数创建存储过程将使您可以访问存储过程外部的EXECUTE... INTO ...
设置的值。
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
然后使用CALL ISH.SAMPLEPROC(?);