Разрешение 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