perl - 解析 Perls "$?"返回代码 : Why is it different from Hana sql error code ? ?

标签 perl debugging error-code hana backticks

我编写了一个 perl 脚本,用于连接到 SAP HANA 上的命令行工具 hdbsql。 Hdbsql 之于 SAP Hana 就像 sqlplus 之于 Oracle。

我正在使用反引号在 hdbsql 上触发 SQL 查询,并在数组中捕获查询结果。以下是执行此操作的代码段:

my $sql_statement = 'SELECT some_column FROM some_table WHERE  
                     some_condition';

my $hdb_sql = "/PROGRA~1/sap/hdbclient/hdbsql.exe";

my $connection = "-i 11 -n 100.450.10.20:31115 -u myUser -p myPwd -j -F   
                  \"|\"";

my @queryResults = `$hdb_sql $connection $sql_statement`;

这是我面临问题的地方。当查询成功执行时,hdbsql 返回代码为 0,返回代码存储在 Perl 变量“$?”中也是零。但在出现错误的情况下,这是我观察到的:

当查询有一些语法问题时,我收到以下错误消息:

* 257: sql syntax error: incorrect syntax near "SELECTS": line 1 col 1 (at 
pos 1) SQLSTATE: HY000

从上面的消息中我们看到Hana sql错误代码是257。 但是如果我打印出 perl 变量“$?”。它给出 256 作为错误/返回代码。

同样,

  • 对于无效的列名,hana sql 错误代码为 260,但 perl 返回 代码是1024。
  • 对于缺少聚合或分组,hana sql 错误代码为 276,但 Perl 返回码是 5120。
  • 如果函数中的参数数量错误,hana sql 错误代码为 316 但perl返回码是15360。
  • 对于无效的表名,hana sql 错误代码为 259,但 perl 返回 代码是768。

等等...

为什么错误代码是“$”?给出的与实际的hana sql返回代码不同吗?在我的脚本中,我想打印出实际的 hana 错误代码。我如何在 perl 中做到这一点。两个代码之间是否存在数学关系

我必须声明,我热衷于使用 backtics。我不想切换到 system() 、 perl pipeline 、使用 perl DBI 或任何其他模块来触发 hdbsql 查询。

我在这个论坛中遇到过一些类似的问题,但对于我的情况来说,它们几乎没有帮助。

感谢您的评论/回答。谢谢!!!!

最佳答案

$? 通常是 256 的倍数。参见 perldoc -f system (尽管这也适用于反引号和 wait 之后的 $? 赋值)。

exit(和 POSIX::_exit)函数期望输入范围为 0 到 255——这是操作系统约定,而不是 Perl 的限制。如果您传递超出该范围的参数,Perl 或操作系统会将其视为您调用了 exit($arg % 256)

所以我认为发生的情况是 hana sql 使用 sql 错误代码对 exit 进行系统调用。此错误代码通常大于 255,因此传播回操作系统的退出代码是 hana error code % 256

当 Perl 收到此错误代码并向 $? 赋值时,它会将该值乘以 256(如 perldoc -f system 中所述),因此关系hana sql 代码和 $? 之间可能类似于:

 $? = (<hana-sql-code> % 256) * 256

或者更加迂腐

 $? = (<hana-sql-code> & 255) << 8

关于perl - 解析 Perls "$?"返回代码 : Why is it different from Hana sql error code ? ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663439/

相关文章:

perl DBI 内存泄漏

Perl 宽字符(Mechanize get/mkdir 失败)

xml - 使用 Perl 解析损坏的 RSS 提要

python - VS Code - 在模块模式下为 console_script 运行调试配置

apache-flink - 获取服务 : AmazonKinesis; Status Code: 502 with apache-flink and localstack Kinesis

perl - Perl 是否有 LLVM 后端?

python - python - 从另一个线程启动后将systrace处理程序添加到python线程的方法?

debugging - Chrome 中的 gwt super 开发模式调试不显示源映射中变量的调试值

java - 如何使用 JNA 处理 Fortran RTL 错误?

java - 为什么我的 `main()` 没有捕获在 junit 测试中 `timer` 中抛出的异常?