Как получить возвращаемое значение DB2 SQL sproc с помощью Perl DBI? - PullRequest
1 голос
/ 02 ноября 2011

Мне нужно получить значение, возвращенное sproc DB2, которое я написал. Sproc возвращает количество строк в таблице и используется вызывающим процессом, чтобы решить, обновлять или нет другие данные.

Я рассмотрел несколько похожих вопросов о SO, но они касаются использования параметров out вместо использования возвращаемого значения sproc, например:

Perl Dbi и хранимые процедуры

Я использую стандартное подключение DBI к базе данных с включенными RaiseError и PrintError.


    $sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')";
    $sth = $dbh->prepare($sql_stmt)
         or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr";

    $rsp = 0;
    $rsp = $sth->execute();
    unless($rsp) {
        print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n");
    }

    print(STDERR "$?\n");

Я попытался посмотреть на $ h-> err как для дескриптора оператора, так и для дескриптора db.

Я бы действительно предпочел сообщить число строк с помощью кода возврата, а не использовать механизм SQLSTATE, если смогу.

Edit:

Я закончил использовать выделенный параметр out, чтобы сообщить количество строк, обновленных следующим образом:


    $sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')";
    $sth = $dbh->prepare($sql_stmt)
         or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr";
    $sth = $dbh->bind_param_inout(1, $rows_updated, 128)
         or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr";

    $rows_updated = 0;
    $rsp = 0;
    $rsp = $sth->execute();
    unless($rsp) {
        print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n");
    }

    print(STDERR "$rows_updated\n");

Редактировать 2:

И теперь, подумав об этом, я понял, что должен применять принцип PragProg «Скажи. Не спрашивай». То есть я не должен называть спрок. затем попросите его вернуть мне номер, прежде чем я решу, звонить ли другому человеку или нет, то есть «спросить».

Я должен просто позвонить первому спрокеру. и пусть он решит, должен ли он вызывать другого спрока или нет, то есть «скажет», и пусть решит.

1 Ответ

1 голос
/ 02 ноября 2011

Что не так с использованием выходного параметра в вашей процедуре.У меня сейчас нет работающей DB2, или я приведу пример, но когда я ее использовал, я уверен, что вы можете определить выходные параметры в процедурах и связать их с помощью bind_param_inout.Я не могу вспомнить, может ли процедура DB2 возвращать значение (например, функцию), но если она может их использовать, используя "? = Call MY_TABLE_SPACE.MY_SPROC ('2011-10-31')", это позволит вам связать выходное возвращаемое значение.Если это не работает, вы можете использовать функцию DB2, которая определенно может вернуть значение.Однако в конце дня вы извлекаете данные из процедуры / функции для привязки выходных параметров - так оно и есть.

Я понятия не имею, что вы подразумеваете под "использованием"SQLSTATE».Я также понятия не имею, что вы имеете в виду, рассматривая $ h-> err, поскольку он устанавливается только в случае сбоя процедуры или невозможности ее вызова (ошибка SQL и т. Д.).

...