`
xinklabi
  • 浏览: 1587194 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

关于ESQL中调用参数为INOUT REFERENCE类型过程会出错的问题浅析

 
阅读更多

对于如下声明的变量I和过程Test:

 

{DECLARE I INTEGER 1;

 

CREATE PROCEDURE Test(INOUT I REFERENCE)
 BEGIN


  SET I = I + 1;
  
  RETURN;
 END;

}

 

 

当调用CALL Test(I);时执行到RUTURN时会抛出异常,不光当I是INTEGER类型时会这样,我试过当I是ROW类型的时候也一样会抛异常,但是如果参数I为IN REFERENCE类型或INOUT INTEGER类型时调用Test不会出问题,或者I引用的是Environment的子树时也不会出问题。

异常栈信息如下:

 

ExceptionList
 RecoverableException
   File:CHARACTER:F:\build\S000_P\src\DataFlowEngine\ImbDataFlowNode.cpp
   Line:INTEGER:739
   Function:CHARACTER:ImbDataFlowNode::createExceptionList
   Type:CHARACTER:ComIbmMQInputNode
   Name:CHARACTER:mySchema/MyMsgFlow#FCMComposite_1_1
   Label:CHARACTER:mySchema.MyMsgFlow.QIn
   Catalog:CHARACTER:BIPv610
   Severity:INTEGER:3
   Number:INTEGER:2230
   Text:CHARACTER:Node throwing exception
   RecoverableException
     File:CHARACTER:F:\build\S000_P\src\DataFlowEngine\ImbComputeNode.cpp
     Line:INTEGER:464
     Function:CHARACTER:ImbComputeNode::evaluate
     Type:CHARACTER:ComIbmComputeNode
     Name:CHARACTER:mySchema/MyMsgFlow#FCMComposite_1_7
     Label:CHARACTER:mySchema.MyMsgFlow.8583ToSoap
     Catalog:CHARACTER:BIPv610
     Severity:INTEGER:3
     Number:INTEGER:2230
     Text:CHARACTER:Caught exception and rethrowing
     RecoverableException
       File:CHARACTER:F:\build\S000_P\src\DataFlowEngine\ImbRdl\ImbRdlStatementGroup.cpp
       Line:INTEGER:602
       Function:CHARACTER:SqlStatementGroup::execute
       Type:CHARACTER:ComIbmComputeNode
       Name:CHARACTER:mySchema/MyMsgFlow#FCMComposite_1_7
       Label:CHARACTER:mySchema.MyMsgFlow.8583ToSoap
       Catalog:CHARACTER:BIPv610
       Severity:INTEGER:3
       Number:INTEGER:2488
       Text:CHARACTER:Error detected, rethrowing
       Insert
         Type:INTEGER:5
         Text:CHARACTER:mySchema.MyMsgFlow_8583ToSoap.Main
       Insert
         Type:INTEGER:5
         Text:CHARACTER:6.3
       Insert
         Type:INTEGER:5
         Text:CHARACTER:Test(I);
       RecoverableException
         File:CHARACTER:F:\build\S000_P\src\DataFlowEngine\ImbRdl\ImbRdlRoutine.cpp
         Line:INTEGER:1466
         Function:CHARACTER:SqlRoutine::clearDownChildEnv
         Type:CHARACTER:ComIbmComputeNode
         Name:CHARACTER:mySchema/MyMsgFlow#FCMComposite_1_7
         Label:CHARACTER:mySchema.MyMsgFlow.8583ToSoap
         Catalog:CHARACTER:BIPv610
         Severity:INTEGER:3
         Number:INTEGER:2933
         Text:CHARACTER:
         Insert
           Type:INTEGER:5
           Text:CHARACTER:I

 

这个问题昨天发现的,今天才想明白是因为什么。可以注意到异常栈最后一层中有个SqlRoutine::clearDownChildEnv,从字面理解它是清理"child"环境,再想想过程Test的参数I是INOUT REFERENCE类型,说明I既是引用其它变量的,又需要传入和传出,关键是在这个引用和传出,引用可以很好理解,I和所引用的变量一样使用,对于传出,ESQL中定义OUT类型的变量是在RETURN时将变量返回,应该可以理解为C或JAVA中函数返回值时候的return I;若是这样,在返回之前,需要为返回值构建一个临时变量暂存,返回之后清理这个临时变量。若是一般的变量,它传入时是之传入,返回时清理它本身没有问题,而现在传入的参数是引用类型的,清理时就会出问题。这也就是为什么参数I为IN REFERENCE类型或INOUT INTEGER类型时调用Test不会出问题的原因。而对于I引用的是Environment子树时Call Test(I);也正常运行的原因也许是Environment树不会被清理的吧。

 

分享到:
评论

相关推荐

    MB esql珍藏版

    - 定义过程使用CREATE PROCEDURE,可包含IN、OUT、INOUT参数,没有直接的返回值。例如,creaseProcedure过程接受一个输入参数并设置一个输出参数的新值。 4. **ESQL Module**: - 模块是一组变量、函数和过程的...

    11.ESQL/C程序中使用DECIMAL数据类型[参照].pdf

    处理DECIMAL数据时,ESQL/C使用了一个名为`dec_t`的结构体,这个结构体在`$INFORMIXDIR/incl/esql/decimal.h`头文件中定义。`dec_t`包含了以下字段: 1. `dec_exp`:基于100的指数,用于表示数值的大小。 2. `dec_...

    基础ESQL使用教程

    ### 基础ESQL使用教程 #### ESQL概述 ESQL,即Extended SQL,是IBM WebSphere Message Broker(WMB)中用于处理消息数据的一种脚本语言。它结合了SQL的强大查询能力和C语言的控制结构,使得在消息传递过程中进行...

    ibm wmb esql ESQL资料

    - **函数和过程**:ESQL内置函数的使用,以及如何定义和调用自定义过程。 - **连接管理**:描述如何在ESQL中建立和管理数据库连接。 4. **D4P2c ESQL part 3 V6.ppt** 可能涉及了ESQL在实际应用中的最佳实践和...

    11.ESQL/C程序中使用DECIMAL数据类型.doc

    本章节将深入探讨 DECIMAL 数据类型的各个方面,包括其基本概念、如何在 C 语言中正确地定义宿主变量来存储 DECIMAL 类型的值、存储要求以及如何使用 ESQL/C 的库函数进行类型转换等。 #### DECIMAL 数据类型的特性...

    关于esql的中文书

    informix&esql/c

    ESQL开发指南手册

    【ESQL开发指南手册】是针对使用ESQL(Embedded SQL)进行开发的技术文档,它涵盖了ESQL的基础知识和技术要点。ESQL是一种将SQL语言嵌入到高级编程语言中,如C语言,以实现更强大、更灵活的数据处理能力。下面我们将...

    ESQL使用说明收集1

    ESQL C使用说明 解决ESQL的问题

    ESQL 编程(使用方法)

    本文将深入探讨ESQL的使用方法,包括游标和动态游标的使用,以及相关概念的解析。 **1. ESQL基本概念** ESQL允许程序员在C、C++、Java等高级编程语言中嵌入SQL语句,以实现数据查询、更新、删除和插入等操作。通过...

    informix esql-c

    从提供的文件信息中,我们可以深入了解关于Informix ESQL-C的重要知识点。Informix ESQL-C是IBM Informix数据库管理系统中用于将SQL语句嵌入到C语言程序中的工具。在数据库编程领域,这种结合了SQL(Structured ...

    esql查询分析器(含源码)

    1. **查询构造**:ESQL查询可以使用字符串或通过强类型API(如`ObjectContext.ExecuteStoreQuery`)构造。字符串构造允许更大的灵活性,但可能导致SQL注入问题,因此在处理用户输入时要特别小心。 2. **实体命名**...

    ESQL-C 学习资料

    **ESQL-C 学习资料** ESQL-C(Enterprise SQL for C)是一种专门用于IBM的CICS(Customer Information Control System)环境的编程语言,它结合了SQL(Structured Query Language)的强大查询功能与C语言的程序设计...

    ESQL/C编程手册

    在"ESQL编程使用说明.doc"文档中,可能会包含以下内容: 1. **基本语句示例**: 如如何使用SELECT语句从消息中提取数据,或如何使用INSERT语句将数据写入消息。 2. **变量和数据类型**: 介绍如何声明和使用不同类型...

    WebShpere Message Broker ESQL使用讲解

    2. 数据类型:包括Boolean(布尔型)、Datetime(日期时间)、Numeric(数值型)、String(字符串)和Reference(引用)等,这些数据类型覆盖了大多数数据处理需求。 3. 声明变量:DECLARE语句用于声明变量,如`...

    esql/c 总结 c中嵌入sql esql/c总结 比较 笔记 详细

    在 ESQL/C 中,有时需要将 SQL 数据类型转换为 C 语言的数据类型,或者反之。例如: - `FLOAT` 可以转换为 `DECIMAL(16)`。 - `INTERGER` 转换为 `DECIMAL(10,0)`。 - `SAMLLINT` 转换为 `DECIMAL(5,0)`。 【数据...

    Esql数据库服务.rar

    熟悉这些基本的SQL命令是理解和使用Esql数据库服务的基础。 此外,Esql数据库服务还可能包括事务处理、索引优化、备份恢复等高级特性。事务处理确保了数据库操作的一致性和完整性,例如ACID(原子性、一致性、隔离...

    ESQL编程

    - **安全性**:在使用ESQL时需要注意防止SQL注入攻击,可以通过参数化查询等方式增强安全性。 - **性能优化**:合理设计SQL语句可以显著提高查询效率。 - **兼容性**:确保所使用的DB-Library版本与数据库服务器兼容...

    esql编程指南适合初学者

    预编译过程是ESQL程序的关键步骤,包括编辑源程序(后缀为.ec),使用预编译器(如ETE)将ESQL转换为C代码(.cpp文件),然后用C编译器编译和链接。 **程序首部**: - **DECLARE部分**:声明特殊主变量,这些变量...

    ESQL/C的数据类型

    总结,ESQL/C的数据类型体系包括基本的数值类型、日期类型和字符串类型,以及相应的转换函数,这为在SQL和C之间进行数据交互提供了便利。理解和熟练使用这些数据类型和转换方法是编写高效、准确的ESQL/C代码的关键。

Global site tag (gtag.js) - Google Analytics