我编写了一个 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/