【问题标题】:Resolving Perls "$?" return code: Why is it different from Hana sql error code ??解析 Perls "$?"返回代码:为什么它与 Hana sql 错误代码不同?
【发布时间】:2015-07-03 23:58:28
【问题描述】:

我编写了一个 perl 脚本,它连接到 hdbsql,这是 SAP HANA 上的一个命令行工具。 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。

等等……

为什么错误代码是“$”? give 与实际的hana sql 返回码不同?在我的脚本中,我想打印出实际的 hana 错误代码。我如何在 perl 中执行此操作。两个代码之间是否存在数学关系

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

我在这个论坛上遇到过一些类似的问题,但对我而言,它们的帮助很小。

感谢您的 cmets/answers。谢谢!!!!

【问题讨论】:

标签: perl debugging error-code hana backticks


【解决方案1】:

$? 通常是 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

【讨论】:

  • 嗨“mob”和“ikegami”谢谢!我明白为什么两个代码不同。如果我理解你的话,如果我有“$”的价值?我无法从中获取原始的 hana 错误代码。对吧??
  • 不对。原始错误代码为$? / 256 + 256(假设hana代码始终在257-511范围内)
  • 嗯,hana sql 错误代码的范围是从 1 到 4105,并且不连续。
  • 那么至少你可以缩小范围。如果 $? 是 768 (3&lt;&lt;8),则 hana 代码是 3、259、515、771、1027、...、3587 或 3843 之一。
  • 当然可以,但这里的想法是解决错误代码,以便我们确切知道问题所在。这样可以更轻松地进行调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
相关资源
最近更新 更多