Разрешение Perls "$?" Код возврата: почему он отличается от кода ошибки Hana SQL?

Я написал Perl-скрипт, который подключается к hdbsql инструмент командной строки в SAP HANA. Hdbsql для SAP Hana - это то, что sqlplus для Oracle.

Я использую backtick для запуска SQL-запроса на hdbsql, и я фиксирую результат запроса в массиве. Ниже приведен фрагмент кода, который выполняет эту операцию:

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.

и так далее...

Почему это коды ошибок, которые "$?" дать отличаются от фактических HNA SQL кодов возврата? В моем скрипте я хочу распечатать фактический код ошибки Хана. Как я могу сделать это в Perl. Есть ли математическая связь между двумя кодами

Я должен заявить, что мне очень нравится использовать backtics. Я не хочу переключаться на system(), perl pipe, использовать perl DBI или любой другой модуль для запуска запроса hdbsql.

Я сталкивался с некоторыми подобными вопросами, заданными на этом форуме, но в моем случае они очень мало помогли.

Я ценю ваши комментарии / ответы. Спасибо!!!!

1 ответ

Решение

$? обычно кратно 256. См. perldoc -f system (хотя это относится к назначению $? после запинок и wait также).

exit (а также POSIX::_exit) функции ожидают ввода в диапазоне от 0 до 255 - это соглашение операционной системы, а не ограничение Perl. Если вы передадите аргумент за пределы этого диапазона, Perl или операционная система будут обрабатывать его так, как если бы вы вызывали exit($arg % 256),

Поэтому я думаю, что происходит, что Хана SQL делает системный вызов exit с кодом ошибки sql. Этот код ошибки обычно больше 255, поэтому код выхода, который распространяется обратно в операционную систему, hana error code % 256,

Когда Perl получает этот код ошибки и присваивает значение $?, это умножает это значение на 256 (как описано в perldoc -f system), поэтому связь между кодом Hana SQL и $? это вероятно что-то вроде:

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

или более педантично

 $? = (<hana-sql-code> & 255) << 8
Другие вопросы по тегам