2

我已经编写了一个 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 查询。

我在这个论坛上遇到过一些类似的问题,但就我而言,它们几乎没有帮助。

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

4

1 回答 1

2

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

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

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

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

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

或者更迂腐

 $? = (<hana-sql-code> & 255) << 8
于 2013-09-06T17:49:54.017 回答