IBM大型机论坛索引
 
登录
 
IBM大型机论坛索引 大型机:搜索 IBM Mainframe论坛:常见问题解答 寄存器
 

存储过程返回不正确的值


IBM大型机论坛 -> DB2
发表新话题   回复主题
查看上一个主题 :: 查看下一个主题  
作者 信息
普拉哈拉德

新的用户


已加入:2010年9月14日
帖子:18
地点:浦那

发布发表:2010年10月28日,星期四,下午6:56
引用回复

伙计们

请帮助我解决存储过程问题。以下是我的内部存储过程。我称此存储过程为我的cobol程序。

Cobol程序返回SQLCODE = 0,但V_ACT_ID的值即将变为垃圾。所以它没有在我的主程序中重新设置适当的数值

存储过程代码:
码:

**************************************数据顶部************** ********************。
创建程序BP.PBP00010(OUT V_ACT_ID INTEGER)                              .
    FENCED                                                                       .
    RESULT SETS 0                                                                .
   外部名称PBP00010                                                       .
    LANGUAGE SQL                                                                 .
    MODIFIES SQL DATA                                                            .
    COLLID CBP001BD                                                              .
   参数样式一般为空                                           .
    NOT DETERMINISTIC                                                            .
    ASUTIME NO LIMIT                                                             .
    PROGRAM TYPE MAIN                                                            .
    SECURITY DB2                                                                 .
    COMMIT ON RETURN NO                                                          .
    STAY RESIDENT YES                                                            .
-------------------------------------------------- ------------------             .
       
--                                                                               
-------------------------------------------------- -------------------           
开始                                                                           
--                                                                               
--                                                                               
    DECLARE v_base_n       INTEGER;                                             
    DECLARE v_base_n1      整数;                                             
    DECLARE v_base_n2      整数;                                             
    DECLARE V_ACT_ID       INTEGER DEFAULT 0;                                   
    DECLARE v_act_upd      CHAR(09);                                             
--                                                                               
    SELECT INTEGER(I_LAST_ACCOUNT_NUMBER) INTO v_base_n                         
    FROM   BP.TBP_CONTROL其中I_COMPANY_ID = 1;                               
--                                                                               
    设置v_base_n1    =  v_base_n   + 1 ;                                         
     SET v_base_n1    =  v_base_n   + 1 ;                                         .
 --                                                                               .
     更新BP.TBP_CONTROL                                                        .
       SET I_LAST_ACCOUNT_NUMBER =字符(v_base_n1)                                .
           其中I_COMPANY_ID = 1;                                                .
 --                                                                               .
     SET v_base_n2    =  v_base_n1  * 10;                                         .
     SET V_ACT_ID     =  v_base_n2;                                               .
 --                                                                               .
 --                                                                               .
 END                                                                              .




Cobol程序:链接部分:

码:

 LINKAGE SECTION.                                         
  01 V_ACT_ID                    PIC    S9(9) USAGE COMP-3
                                 VALUE  ZEROS.             


程序划分:

码:

执行SQL                           
  CALL BP.PBP00010(:V_ACT_ID)     
结束执行                           


执行这段代码后。我确实获得了SQL代码零,但是返回的值不正确。
回到顶部
查看用户资料 发送私信
赤胜

全球主持人


已加入:2009年10月3日
职位:1788
地点:伊利诺伊州布卢明顿

发布发表:2010年10月28日,星期四,下午7:18
引用回复

并且该返回值实际上是否适合INTEGER(,二进制)字段?
回到顶部
查看用户资料 发送私信
普拉哈拉德

新的用户


已加入:2010年9月14日
帖子:18
地点:浦那

发布发表:2010年10月28日,星期四,下午7:28
引用回复

嗨,赤神上,

是的,返回值是一个整数(除了唯一的9位数字,什么都没有)。

我的主程序中返回的实际值(阀芯详细信息)

码:

返回值:000³00000
回到顶部
查看用户资料 发送私信
赤胜

全球主持人


已加入:2009年10月3日
职位:1788
地点:伊利诺伊州布卢明顿

发布发表:2010年10月28日,星期四,下午7:39
引用回复

普拉哈拉德写道:
嗨,赤神上,

是的,返回值是一个整数(除了唯一的9位数字,什么都没有)。

我的主程序中返回的实际值(阀芯详细信息)

码:

返回值:000³00000

因此,这将与将V-ACT-ID声明为COMP-3 ( 链接部分中的压缩十进制)变量,不是吗?
回到顶部
查看用户资料 发送私信
dbzTHEdinosauer

全球主持人


已加入:2006年10月20日
帖子:6967
位置:瓷宝座

发布发表:2010年10月28日,星期四,下午7:54
引用回复

赤胜

好眼睛,好抓住(罗伯特抓住错误)
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年10月28日,星期四,晚上8:13
引用回复

嗨,

首先谢谢。

我现在更改了这段代码。

现在将链接节声明为comp而不是comp-3:

码:

01 V_ACT_ID                    PIC    S9(9) USAGE COMP
                               VALUE  ZEROS.           


现在我得到的是执行此代码后:

阀芯详细信息:

码:

执行后   :000655360


现在,它为每次执行给出了标准编号000655360。
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年10月28日,星期四,晚上8:45
引用回复

为什么在链接部分定义v-act-id?那行不通。
主机变量必须位于工作存储中。
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年10月29日,星期五,上午10:36
引用回复

我什至尝试在工作存储区中声明V_ACT_ID。仍然返回零值。
回到顶部
查看用户资料 发送私信
迪克·谢勒

主持人荣誉


已加入:2006年11月23日
帖子:19245
位置:矩阵内部

发布发表:2010年10月29日,星期五,下午7:26
引用回复

您好,

您更正了PIC还是仍在使用comp-3。 。 。?

(如先前的Akatsukami所述)。 。 。
回到顶部
查看用户资料 发送私信
达夫波塞兰

活跃的成员


加入时间:2006年12月1日
职位:747
所在地:宾夕法尼亚州

发布发表:2010年10月29日,星期五,下午7:42
引用回复

迪克

TS表示已切换为USAGE COMP。

我想知道为什么不只使用PIC 9(9)。没有别的。
回到顶部
查看用户资料 发送私信
赤胜

全球主持人


已加入:2009年10月3日
职位:1788
地点:伊利诺伊州布卢明顿

发布发表:2010年10月29日,星期五,晚上8:50
引用回复

1984年写道:
现在,它为每次执行给出了标准编号000655360。

可疑;十进制数655,360是X'000A0000'。我至少会怀疑对齐问题。

我建议你服用 达夫波塞兰建议使用字符/分区小数/ DISPLAY变量进行模块间通信。
回到顶部
查看用户资料 发送私信
迪克·谢勒

主持人荣誉


已加入:2006年11月23日
帖子:19245
位置:矩阵内部

发布发表:2010年10月29日,星期五,晚上9:15
引用回复

引用:
TS表示已切换为USAGE COMP。
谢谢戴夫 icon_smile.gif

我错过了。 。 。 icon_redface.gif

d
回到顶部
查看用户资料 发送私信
赤胜

全球主持人


已加入:2009年10月3日
职位:1788
地点:伊利诺伊州布卢明顿

发布发表:2010年10月29日,星期五,晚上9:25
引用回复

迪克·谢勒(Dick scherrer)写道:
引用:
TS表示已切换为USAGE COMP。
谢谢戴夫 icon_smile.gif

我错过了。 。 。 icon_redface.gif

也许是因为TS显然已将其会员ID从 普拉哈拉德1984年?
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日星期三下午1点30分
引用回复

嗨,

这仍然是一个问题。我什至试图以char模式获取值。仍然失败。
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年11月3日,星期三2:31 pm
引用回复

您不应该在编码中再次声明输出变量。
去掉
码:
    DECLARE V_ACT_ID       INTEGER DEFAULT 0;   



额外1:无需编码和调用存储过程,您可以
码:
    select  整数(I_LAST_ACCOUNT_NUMBER)* 10从最终表格(                             
    update TBP_CONTROL
   设置I_LAST_ACCOUNT_NUMBER =字符(integer(I_LAST_ACCOUNT_NUMBER)+1)
   其中I_COMPANY_ID = 1    )

额外2:函数会比过程适当地有用。

额外3注意:请考虑使用序列而不是tbp_control表,这将导致锁定问题。


V_ACT_ID实际上为NULL,因为在proc中没有为其分配任何值(由于重复定义)
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日,星期三3:01 pm
引用回复

谢谢GuyC,

上面的代码是一个示例,我只是想首先建立连接。完成后,将插入唯一的nbr生成的实际逻辑。

因此,我需要使此SP起作用。
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年11月3日,星期三3:03 pm
引用回复

照我说的去做,它将
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日,星期三3:11 pm
引用回复

谢谢GuyC,

我尝试了该选项。我从声明中删除了V_ACT_ID(重复)
并在COBOL工作存储中声明了相同的变量。现在它给出的值是零(因为我在COBOL程序中将变量初始化了)。


谢谢
拉杰什
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年11月3日,星期三,下午3:23
引用回复

publib.boulder.ibm.com写道:
不要包含FENCED或EXTERNAL关键字
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日,星期三,下午3:42
引用回复

谢谢GuyC,

我删除了“ FENCED”命令。这次也很不幸。
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年11月3日星期三下午4:03
引用回复

还删除了“外部名称PBP00010”吗?
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日星期三下午4:24
引用回复

是的GuyC,FENCED和EXTERNAL均被删除。

以下是我的SP程序:


码:

创建步骤BP.PBP00024(INOUT V_ACT_ID char(09))                     
--  FENCED                                                                 
    RESULT SETS 0                                                           
-- 外部名称PBP00024                                                 
    LANGUAGE SQL                                                           
    MODIFIES SQL DATA                                                       
    COLLID CBP001BD                                                         
-- 参数样式一般                                                 
    NOT DETERMINISTIC                                                       
    ASUTIME NO LIMIT                                                       
    PROGRAM TYPE MAIN                                                       
    SECURITY DB2                                                           
    COMMIT ON RETURN NO                                                     
    STAY RESIDENT NO                                                       
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2010年11月3日,星期三5:03 pm
引用回复

这在我这边工作:
码:
--drop程序来宾                   ;
创建程序访客(INOUT V_ACT_ID char(9))                     
    RESULT SETS 0                                                           
    LANGUAGE SQL                                                           
    MODIFIES SQL DATA                                                       
    COLLID CBP001BD                                                         
    NOT DETERMINISTIC                                                       
    ASUTIME NO LIMIT                                                       
    PROGRAM TYPE MAIN                                                       
    SECURITY DB2                                                           
    COMMIT ON RETURN NO                                                     
    STAY RESIDENT NO     
   
    开始                                                                           
                                                                               
    DECLARE v_base_n2      整数;                                             

     SET v_base_n2    =  10;
     SET V_ACT_ID     =  char(v_base_n2);                                               
 --                                                                               
 --                                                                               
 END
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日,星期三5:07 pm
引用回复

当我独立运行它时,它对我有用(我们有AQT工具,可以通过它运行SP)。

但是,当我通过COBOL程序调用它时,它不返回任何值。
回到顶部
查看用户资料 发送私信
1984年

新的用户


已加入:2010年10月28日
帖子:16
地点:印度

发布发表:2010年11月3日,星期三5:07 pm
引用回复

请让我知道,您如何运行它?
通过COBOL?
回到顶部
查看用户资料 发送私信
查看上一个主题 :: :: 查看下一个主题  
发表新话题   回复主题 查看书签
所有时间均为格林尼治标准时间+ 6小时
论坛索引 -> DB2 转到页面 1, 2  下一页

 


类似主题
话题 论坛 回覆
没有新帖 在JCL Procedure中我们如何执行R ... 清单和REXX 7
没有新帖 在REXX中执行DSNTEP2,即调用... 清单和REXX 4
没有新帖 预处理器语句在P ... PL / I和组装商 1
没有新帖 手续科 COBOL程式设计 2
没有新帖 如何调试DB2存储过程我们... DB2 0
搜索我们的论坛:


回到顶部