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

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

Я использую обратную кавычку для запуска 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.

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

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

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

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

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


person Chiseled    schedule 06.09.2013    source источник
comment
Слегка связанный: stackoverflow.com/questions/18640737/   -  person mob    schedule 06.09.2013


Ответы (1)


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

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

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

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

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

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

 $? = (<hana-sql-code> & 255) << 8
person mob    schedule 06.09.2013
comment
привет моб и икегами спасибо !!! Я понимаю, почему эти два кода разные. Если я правильно вас понял, если у меня стоимость $? я не могу получить от него исходный код ошибки hana. Правильно ?? - person Chiseled; 07.09.2013
comment
Не правильно. Исходный код ошибки - $? / 256 + 256 (при условии, что код hana всегда находится в диапазоне 257-511). - person mob; 07.09.2013
comment
Коды ошибок hana sql варьируются от 1 до 4105 и не являются непрерывными. - person Chiseled; 07.09.2013
comment
Тогда, по крайней мере, вы можете сузить круг вопросов. Если $? - 768 (3<<8), то код хана - один из 3, 259, 515, 771, 1027, ..., 3587 или 3843. - person mob; 07.09.2013
comment
Конечно, но идея состоит в том, чтобы исправить код ошибки, чтобы мы точно знали, в чем проблема. Таким образом упрощается отладка. - person Chiseled; 07.09.2013
comment
Если идея в этом, сохраните стандартный поток ошибок hbdsql и прочтите его. - person mob; 07.09.2013
comment
yupp !! Это вариант. - person Chiseled; 07.09.2013
comment
Интересно, есть ли в Perl способ фиксировать и вывод, и ошибку (в случае сбоя) в одном и том же скаляре или даже в двух разных скалярах. - person Chiseled; 09.09.2013