对于如下声明的变量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树不会被清理的吧。
分享到:
相关推荐
- 定义过程使用CREATE PROCEDURE,可包含IN、OUT、INOUT参数,没有直接的返回值。例如,creaseProcedure过程接受一个输入参数并设置一个输出参数的新值。 4. **ESQL Module**: - 模块是一组变量、函数和过程的...
处理DECIMAL数据时,ESQL/C使用了一个名为`dec_t`的结构体,这个结构体在`$INFORMIXDIR/incl/esql/decimal.h`头文件中定义。`dec_t`包含了以下字段: 1. `dec_exp`:基于100的指数,用于表示数值的大小。 2. `dec_...
### 基础ESQL使用教程 #### ESQL概述 ESQL,即Extended SQL,是IBM WebSphere Message Broker(WMB)中用于处理消息数据的一种脚本语言。它结合了SQL的强大查询能力和C语言的控制结构,使得在消息传递过程中进行...
- **函数和过程**:ESQL内置函数的使用,以及如何定义和调用自定义过程。 - **连接管理**:描述如何在ESQL中建立和管理数据库连接。 4. **D4P2c ESQL part 3 V6.ppt** 可能涉及了ESQL在实际应用中的最佳实践和...
本章节将深入探讨 DECIMAL 数据类型的各个方面,包括其基本概念、如何在 C 语言中正确地定义宿主变量来存储 DECIMAL 类型的值、存储要求以及如何使用 ESQL/C 的库函数进行类型转换等。 #### DECIMAL 数据类型的特性...
informix&esql/c
【ESQL开发指南手册】是针对使用ESQL(Embedded SQL)进行开发的技术文档,它涵盖了ESQL的基础知识和技术要点。ESQL是一种将SQL语言嵌入到高级编程语言中,如C语言,以实现更强大、更灵活的数据处理能力。下面我们将...
ESQL C使用说明 解决ESQL的问题
本文将深入探讨ESQL的使用方法,包括游标和动态游标的使用,以及相关概念的解析。 **1. ESQL基本概念** ESQL允许程序员在C、C++、Java等高级编程语言中嵌入SQL语句,以实现数据查询、更新、删除和插入等操作。通过...
从提供的文件信息中,我们可以深入了解关于Informix ESQL-C的重要知识点。Informix ESQL-C是IBM Informix数据库管理系统中用于将SQL语句嵌入到C语言程序中的工具。在数据库编程领域,这种结合了SQL(Structured ...
1. **查询构造**:ESQL查询可以使用字符串或通过强类型API(如`ObjectContext.ExecuteStoreQuery`)构造。字符串构造允许更大的灵活性,但可能导致SQL注入问题,因此在处理用户输入时要特别小心。 2. **实体命名**...
**ESQL-C 学习资料** ESQL-C(Enterprise SQL for C)是一种专门用于IBM的CICS(Customer Information Control System)环境的编程语言,它结合了SQL(Structured Query Language)的强大查询功能与C语言的程序设计...
在"ESQL编程使用说明.doc"文档中,可能会包含以下内容: 1. **基本语句示例**: 如如何使用SELECT语句从消息中提取数据,或如何使用INSERT语句将数据写入消息。 2. **变量和数据类型**: 介绍如何声明和使用不同类型...
2. 数据类型:包括Boolean(布尔型)、Datetime(日期时间)、Numeric(数值型)、String(字符串)和Reference(引用)等,这些数据类型覆盖了大多数数据处理需求。 3. 声明变量:DECLARE语句用于声明变量,如`...
在 ESQL/C 中,有时需要将 SQL 数据类型转换为 C 语言的数据类型,或者反之。例如: - `FLOAT` 可以转换为 `DECIMAL(16)`。 - `INTERGER` 转换为 `DECIMAL(10,0)`。 - `SAMLLINT` 转换为 `DECIMAL(5,0)`。 【数据...
熟悉这些基本的SQL命令是理解和使用Esql数据库服务的基础。 此外,Esql数据库服务还可能包括事务处理、索引优化、备份恢复等高级特性。事务处理确保了数据库操作的一致性和完整性,例如ACID(原子性、一致性、隔离...
- **安全性**:在使用ESQL时需要注意防止SQL注入攻击,可以通过参数化查询等方式增强安全性。 - **性能优化**:合理设计SQL语句可以显著提高查询效率。 - **兼容性**:确保所使用的DB-Library版本与数据库服务器兼容...
预编译过程是ESQL程序的关键步骤,包括编辑源程序(后缀为.ec),使用预编译器(如ETE)将ESQL转换为C代码(.cpp文件),然后用C编译器编译和链接。 **程序首部**: - **DECLARE部分**:声明特殊主变量,这些变量...
总结,ESQL/C的数据类型体系包括基本的数值类型、日期类型和字符串类型,以及相应的转换函数,这为在SQL和C之间进行数据交互提供了便利。理解和熟练使用这些数据类型和转换方法是编写高效、准确的ESQL/C代码的关键。