热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

RTP记录log的机制

我们RCV这边经常跑的一个concurrentrequestRTP:ReceivingTransactionProcessor,主要是用来处理RCV_TRANSACTIONS_INTERFACE里面的数据的.这个concurrentprogram里面包含许多文件,比较重要的有:identRVCTPRVCTP:$Header:rvctp.oc120.0.120

我们 RCV 这边经常跑的一个concurrent request RTP: Receiving Transaction Processor, 主要是用来处理 RCV_TRANSACTIONS_INTERFACE 里面的数据的. 这个 concurrent program 里面包含许多文件, 比较重要的有: ident RVCTPRVCTP: $Header: rvctp.oc 120.0.120

我们 RCV 这边经常跑的一个concurrent request RTP: Receiving Transaction Processor, 主要是用来处理 RCV_TRANSACTIONS_INTERFACE 里面的数据的.

\

这个 concurrent program 里面包含许多文件, 比较重要的有:

ident RVCTP
RVCTP:
     $Header: rvctp.oc  120.0.12000000.1 2007/01/16 23:53:49 appldev ship $
     $Header: rvtbm.lpc 120.13.12010000.10 2013/03/15 02:51:16 zhlee ship $ 
     $Header: rvtpt.lpc 120.28.12010000.33 2013/07/15 07:12:37 smai ship $
     $Header: rvtvq.lpc 120.8.12010000.17 2013/04/03 11:40:30 wayin ship $
     $Header: rvtuq.lpc 120.9.12000000.7 2009/07/07 09:47:49 YUZZHANG01 ship $
     $Header: pouer.lpc 120.2 2006/06/14 07:57:02 arudas noship $
     $Header: rvtlo.lpc 120.1.12010000.7 2013/01/05 16:02:14 gke ship $
     $Header: rvtoc.lpc 120.1.12010000.5 2013/03/28 22:38:31 vthevark ship $
     $Header: rvtpa.lc  120.6.12010000.3 2009/07/07 08:58:22 ksivasa ship $
     $Header: rvtpd.lc  120.1.12010000.3 2009/07/07 09:03:17 ksivasa ship $
     $Header: rvtsh.lpc 120.10.12010000.3 2009/03/06 22:09:40 vthevark ship $
     $Header: rvtth.lpc 120.29.12010000.9 2012/05/30 15:50:03 gke ship $
     $Header: rvtvt.lpc 120.9.12010000.10 2013/03/28 18:19:11 vthevark ship $
     $Header: rvsco.lpc 120.4.12010000.12 2012/09/27 23:10:24 vthevark ship $
     $Header: rvsrv.lpc 120.4.12010000.16 2013/02/04 07:34:37 zhizheng ship $
     $Header: rvsit.lpc 120.5.12010000.6 2013/02/04 07:26:30 zhizheng ship $
     $Header: rvsdl.lpc 120.5.12010000.17 2011/11/28 05:19:19 xiameng ship $
     $Header: rvssh.lpc 120.2.12010000.3 2009/07/07 09:56:26 ksivasa ship $
     $Header: rvsut.lpc 120.3.12010000.14 2012/05/28 04:53:57 gke ship $
     $Header: rvtcl.lpc 120.6.12010000.3 2009/07/07 09:15:25 ksivasa ship $
     $Header: rvtii.lpc 120.19.12010000.27 2013/08/14 09:58:23 gke ship $
     $Header: rvtls.lpc 120.7.12010000.14 2012/01/30 12:31:22 ksivasa ship $
     $Header: rvtoo.lpc 120.3.12010000.3 2009/07/07 09:08:40 ksivasa ship $
     $Header: rvsrq.lpc 120.5.12010000.3 2009/07/07 09:53:56 ksivasa ship $
     $Header: rvspo.lpc 120.3.12010000.3 2009/07/07 09:53:12 ksivasa ship $

这些文件是在 RTP log 里面经常见到的. 这里我们主要看看, 在这些文件中是用怎样的机制写 log 的.

首先, 要在要写日志的函数里面声明一个变量:

text     strbuf[BUFLEN+1];

然后用下面的语句:

    strcpy((char *)strbuf,"");
    sprintf((char *)strbuf,"RVTUQ:370 req_line_id %ld\n", (long)req_line_id);
    Debug(strbuf,TRUE,TRUE);

第一句把 strbuf 清空, 然后把后面的字符串和整型数写入 strbuf, 第三句 Debug 把 strbuf 写入日志. Debug 后面有两个参数:

#define Debug(message,check_sql_error,no_rows_is_error)

第二个参数 check_sql_error 表示 如果希望检查 SQL error, 就设为 TRUE, 否则设为 FALSE. no_rows_is_error 表示 是不是把 NO_DATA_FOUND 当做一个 error. 如果是, 设为TRUE.

Concurrent Request 里面的文件都是 .c 的代码, 如果里面要写SQL, 就要写一句:

    EXEC SQL
然后下面写上 SQL. 这句 SQL 有可能会出错, 这时需要一个方法把错误消息写到 log 里面去. 比如:
       EXEC SQL
       select transaction_id,
              unit_of_measure
         into :parent_trx_id,
              :rec_uom
         from rcv_transactions
        where transaction_type in ('RECEIVE','MATCH')
        start with transaction_id = :p_trx_id 
   connect by transaction_id = prior parent_transaction_id;

为了捕获这句SQL 可能发生的错误, 我们在这句后面写一句:

pouersql("RVTUQ", "134", FALSE )
pouersql() 这个函数是在 pouer.lpc 文件 (po user error) 中定义的, 如果上面的SQL 发生了错误, 那么就会把 error message 写入 message stack. 并且返回 true.

这里面有三个参数, routine, location, no_rows_is_err.

routine 表示SQL 发生错误的文件名, 上面的例子中是 RVTUQ.

location 表示SQL 发生错误的位置, 上面的例子中是 134. 这样我们看到日志里面的这个位置就很容易定位到这句SQL.

no_rows_is_err 表示 是不是把 NO_DATA_FOUND 当做 error 来处理. 上面的例子中我们没有当做 error.

在 pouersql 这个函数的内部, 会去sqlca 里面提取 sqlcode. sqlca 全称是: sql communications area, 是一个用来记录SQL 执行信息的地方. 每次执行一个SQL 都会返回 sqlcode. 如果sqlcode = 0, 那么表示没有错误. 如果 sqlcode > 0, 表示有exception, 如果 sqlcode <0, 表示发生 error, 要rollback. 我们平时接触的error 都是小于0 的, 但是 NO_DATA_FOUND 是 大于0 的, 代码 1403. pousersql() 函数会去 sqlca 里面提取 sqlcode, 然后判断是否 sqlcode <0 还是 sqlcode > 0, 如果判断小于0, 那么才把错误消息写入 message stack. 如果大于0, 并且参数里面 no_rows_is_err 设为 TRUE, 那么也会写如message stack.

每次执行一次 SQL 就会更新一次 sqlca, 所以这个结构只记录最近一次执行SQL 的信息 . 错误消息是记录在sqlca.sqlerrm.sqlerrmc 里面的. 所以会把这个里面的字符串写入message stack. 但是sqlerrmc 最多只能记录70 个字符, 所以如果错误消息很长的话, 就会被截断.

上面的SQL 发生错误的话, pouersql () 返回值为 TRUE. 那么在调用这个函数的地方, 比如 rvtpt.lpc 文件中, 就会捕捉到这个返回值, 判断返回值之后确定发生error 了, 就会调用:

pouertrace( "RVTUQ", "000", "rvtuqdebitmemo()" )
pouertrace () 这个函数也是在pouer.lpc 文件中定义的, 这个函数的返回值总是 false. 它的主要作用也是把错误消息写入 message stack. 三个参数分别为:

file: 表示发生错误的文件
location: 表示错误的位置
subroutine: 表示发生错误的函数.

上面我们提到, sqlerrmc 只能保存70 个字符. 如果错误消息多余70 个字符, 想要得到所有的错误消息的话, 就需要用 sqlglm() 函数. 在使用这个函数之前, 我们要确保 sqlcode <0, 否则取出来的错误消息是前面的SQL 的消息.

if (pouersql("RVTUQ","019",TRUE))
{                           
   char msg[510];
   size_t buf_len, msg_len;
   buf_len = sizeof (msg);
   sqlglm(msg, &buf_len, &msg_len);
                
   strcpy((char *)strbuf,"");
   sprintf((char *)strbuf,"RVTUQ:001 YU SQL ERROR %s \n", (text *) msg);
   Debug(strbuf,TRUE,TRUE);
   return( FALSE );
}
sqlglm() 函数把错误消息写入 msg, 然后只要把 msg 用 Debug() 函数写入日志就可以了. sqlglm() 函数对字数也有限制, 最大为512 个字符. 相比 sqlerrmc 的70 个字符多很多了.
推荐阅读
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
author-avatar
mobiledu2502912781
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有