За последние 24 часа нас посетили 17155 программистов и 1300 роботов. Сейчас ищут 1744 программиста ...

Вызов хранимой процедуры с параметрами и получение результат

Тема в разделе "MSSQL", создана пользователем alexey_baranov, 22 июл 2009.

  1. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Привет!

    Есть на MSSQL 2005 хранимая процедура [dbo].[PaymentAddFromCSV] помогите вызвать через PHP. За SQL прошу ничего не говорить. Какая есть, такую и вызываю

    [sql]USE [cti-test]
    GO
    /****** Object: StoredProcedure [dbo].[PaymentAddfromCSV] Script Date: 07/22/2009 08:54:25 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER procedure [dbo].[PaymentAddfromCSV]
    @AccountNumber BCOMMENT, -- номер лицевого счета (Varchar 255)
    @PaymentSumm money, -- сумма платежа
    @PaymentDate datetime, -- дата, время платежа (необязательный)
    @PSID BCOMMENT, -- наименование платежной системы (Varchar 255)
    -- @AuthResult int out, --возвращаемый параметр - результат выполнения:
    -- @AuthResult = 5 ACCOUNT_OTHER_FATAL
    -- @AuthResult = 2 ACCOUNT_NOT_EXISTS
    -- @AuthResult = 0 PAYMENT_OK
    @CurrencyCode int, -- код валюты
    @txn_id varchar(255) = null,
    @ExternalPaymentID varchar(255) = null,
    @PaymentNumber int = null, --номер платежа
    @PaymentType int = 2 --тип платежа, по умолчанию 2 - платежное поручение
    as
    begin
    declare
    @pd_id BIDENT,
    @PayerID BIDENT,
    @Number int,
    @DisplayCurrency BIDENT,
    @SubscriberID BIDENT,
    @DestAccID BIDENT,
    @DestDescription BCOMMENT,
    @ID BIDENT,
    @CurRate float,
    @AccountCurrencyID BIDENT,
    @AuthResult int
    select @AuthResult = 5 --ACCOUNT_OTHER_FATAL
    begin tran
    if @PaymentNumber is null
    begin
    select
    @Number = isnull(max(Number), 0) + 1
    from FinanceDocument
    where FinanceDocumentTypeID = 2
    end
    else
    begin
    Select @Number = @PaymentNumber
    end
    --Временно предполагаем что все платежи рублевые
    select
    top 1
    @DisplayCurrency = ID
    from Currency
    where Code = 'RUR'
    order by ID
    if (
    select
    top 1
    count(1) from Account a where a.Number = @AccountNumber and a.AccType in (4, 5)) > 1
    goto Error
    select
    @SubscriberID = a.SubscriberID,
    @DestAccID = a.ID,
    @AccountCurrencyID = ga.CurrencyID
    from Account a,
    GroupAccount ga
    where a.ID = ga.ID
    and a.AccType in (4, 5)
    and a.Number = @AccountNumber
    if @DestAccID is null begin
    select @AuthResult = 2 --ACCOUNT_NOT_EXISTS
    goto error
    end
    select @DestDescription = 'Платеж через ' + @PSID
    exec GetTwoCurrencyRate
    @Rate = @CurRate out,
    @FromCurrencyID = @DisplayCurrency,
    @ToCurrencyID = @AccountCurrencyID
    if (@@error!=0) or (0=1) goto Error
    select @PaymentSumm = @PaymentSumm * @CurRate
    exec PaymentDocumentAdd
    @ID = @pd_id out,
    @Number = @Number,
    @DocumentDate = @PaymentDate,
    @Amount = @PaymentSumm,
    @CurrencyID = @DisplayCurrency,
    @SubscriberID = @SubscriberID,
    @PaymentDocumentTypeID = @PaymentType,
    @NotificationDocumentTypeID = 3, --Уведомление платежной системы
    @ConfirmationStateID = 2 --Подтверждён
    if (@@error!=0) or (0=1) goto Error
    exec PaymentEntryAdd
    @ID = @ID out,
    @Qty = @PaymentSumm,
    @EntryDate = @PaymentDate,
    @DocName = '-',
    @PaymentTypeID = 3, -- payment transfer
    @AccountID = @DestAccID,
    @Description = @DestDescription,
    @LegalInfoID = null,
    @PaymentDocumentID = @pd_id
    if (@@error!=0) or (0=1) goto Error
    commit
    select @AuthResult = 0 --PAYMENT_OK
    select @AuthResult
    return
    Error:
    select @AuthResult
    rollback tran
    end[/sql]

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

    PHP:
    1.  
    2. <?php
    3. $db= new PDO("odbc:Driver={SQL Native Client};Server=217.114.191.230;Database=cti-test; Uid=username;Pwd=password;");
    4. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    5. $st= $db->prepare("
    6. exec [dbo].[PaymentAddFromCSV]
    7. @AccountNumber= :AccountNumber,
    8. @PaymentSumm= :PaymentSumm,
    9. @PaymentDate= :PaymentDate,
    10. @PSID= '1С',
    11. @CurrencyCode = 1,
    12. @txn_id= null,
    13. @ExternalPaymentID = null,
    14. @PaymentNumber = :PaymentNumber,
    15. @PaymentType = :PaymentType
    16. ");
    17.  
    18. $st->bindValue(":AccountNumber", $argv[1], PDO::PARAM_STR);
    19. $st->bindValue(":PaymentSumm", $argv[2], PDO::PARAM_STR);
    20. $st->bindValue(":PaymentDate", ereg_replace("(.{2})\.(.{2})\.(.{2})", '\\2.\\1.\\3 12:00:00', $argv[3]), PDO::PARAM_STR);
    21. $st->bindValue(":PaymentNumber", $argv[6], PDO::PARAM_INT);
    22. $st->bindValue(":PaymentType", $argv[7], PDO::PARAM_INT);
    23. $st->execute();
    24.  
    25. echo $st->fetch();
    Выдает ошибку на команде $st->execute() типа А если запустить в менеджере MSSQL, то такой код проходит. Причем возвращает одну строчку с одной колонкой без имени, которую хотелось бы получить внутрь PHP.
     
  2. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    И почему в SQLServer параметры внутрь процедуры передаются не в скобках, а просто через запятую? Это нормально?
     
  3. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    И как это хранимая процедура возвращает значение, например в строке 106 или в строке 109? Процедура же вроде не умеет возвращать значение, как функция.
     
  4. KarpovSergei

    KarpovSergei Активный пользователь

    С нами с:
    25 авг 2009
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Russia
    Âûçîâ õðàíèìîé ïðîöåäóðû ñ ïàðàìåòðàìè è ïîëó÷åíèå ðåçóëüòàò

    Îòëè÷íûé âîïðîñ