Sqlsrv не читает ответ хранимой процедуры - PullRequest
0 голосов
/ 09 июля 2019

Я использую драйвер sqlsrv и получаю данные с сервера просто отлично, используя "sqlsrv_query". Я вызвал много процедур, и все работает нормально, но не работает с одной процедурой.

Все предыдущие процедуры Stores только что сделали выбор в базу данных, но эта сначала вставляет некоторую информацию в таблицу, а затем возвращает значение (интересно, именно это и является причиной проблемы).И здесь я не могу прочитать значение

. Я вызываю SP следующим образом:

$consulta = "exec TP_APP_WEB @CONTRATO = '2007061006201', @AFILIADO = '2007060389', @CODIGO_PRESTADOR = '00018', @OP = 'I'";

, а затем выполняю запрос, используя "sqlsrv_query" или "sqlsrv_execute".

и я пытаюсь прочитать ответ разными способами:

sqlsrv_fetch sqlsrv_get_field sqlsrv_fetch_object sqlsrv_fetch_array

и никто из них не читает ответ.

Я не получаю ошибки, только пустые строки, где должен быть ответ.

РЕДАКТИРОВАТЬ: Это весь SP


select @maximo = max(orde_nume) from cap_tbl_orden_atencion where orde_sucu = '001' 

select 
    @anio_contrato = afco_anio, @mes_contrato = afco_mes, @tipo_contrato = afco_tipo, @numero_contrato = afco_nume, @anio_afiliado = afco_afan,
    @mes_afiliado = afco_afme, @numero_afiliado = afco_afnu, @plan = afco_plan, @porcentaje = porc_red, @codigo_contratante = CONT_CONT
from 
    cap_tbl_afiliado_por_contrato 
    inner join cap_tbl_copago_por_plan on afco_plan = cod_plan AND tipo_prestacion = '0101' and cobertura = '00'
    INNER JOIN CAP_TBL_CONTRATOS ON CONT_ANIO+CONT_MES+CONT_TIPO+CONT_NUME = afco_anio+afco_mes+afco_tipo+afco_nume
where 
    afco_anio+afco_mes+afco_tipo+afco_nume = @contrato and afco_afan+afco_afme+afco_afnu = @AFILIADO and afco_esta = 'A' 


 select @periodo =  max(periodo) from CAP_TBL_PERIODO_POR_CONTRATO where anio+mes+tipo+contrato = @CONTRATO
 if @maximo is null 
 set @maximo = 0 
 set @maximo = @maximo +1 

 set @NUMERO_ODA = right('0000000'+convert(varchar(7), @maximo), 7) 

SELECT @DESC_MOTIVO= 'ODA : '+@NUMERO_ODA, @fecha = getdate()

 IF @MAXIMO2 IS NULL 
 SET @MAXIMO2 = 0 
 SET @MAXIMO2 = @MAXIMO2 +1 

INSERT INTO CAP_TBL_AUTORIZACION_PROCESO 
 VALUES('001', @MAXIMO2, 54, @FECHA, @NUMERO_ODA, 0, 0, @desc_motivo, @DESC_MOTIVO, '197', '000', 0, 'A', GETDATE(), @anio_contrato, @mes_contrato, 
 @tipo_contrato, @numero_contrato) 

 insert into cap_tbl_orden_atencion 
 values ('001', @NUMERO_ODA, '01', GETDATE(), @CODIGO_PRESTADOR, @TIPO_PRESTADOR, @anio_contrato, @mes_contrato, @tipo_contrato, @numero_contrato, 
 @codigo_contratante, @tipo_contrato, @anio_afiliado, @mes_afiliado, @numero_afiliado, '', '', '', '', '0101', @porcentaje, @VALOR_ODA, 0, @valor_oda, 
 @VALOR_AFILIADO, @VALOR_CUBIERTO, @VALOR_CUBIERTO, @VALOR_AFILIADO, 'ODA WEB', 'C', 'A', '197', 'Z01', @TIPO_PRESTADOR, @CODIGO_PRESTADOR, @PLAN, '01', 
 0, @periodo, GETDATE(), 'N', '001', 0, DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), DATEPART(DAY, GETDATE()), '00', 
 0, 0, 0, DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), DATEPART(DAY, GETDATE()), '000', 0, 0, 0, '000', 
 0, '197', GETDATE(), '197', GETDATE(), '0101', '', '01', '01', 'N', '001', 0, 'WEB', 0, '01', '01') 

 SET @PRESTACION = '01-01-01-99961'

 if (@plan = 1 and @PLAN_PRESTADOR = 1) or (@plan = 2 and @PLAN_PRESTADOR = 2) or (@plan = 2 and @PLAN_PRESTADOR = 1)
    SET @PRESTACION = '01-01-01-99961'
 IF @PLAN = 1 AND @PLAN_PRESTADOR = 2
    SET @PRESTACION = '01-01-01-99993'
 IF @PLAN = 1 AND @PLAN_PRESTADOR = 3
    SET @PRESTACION = '01-01-01-99994'
 IF @PLAN = 2 AND @PLAN_PRESTADOR = 3
    SET @PRESTACION = '01-01-01-99995'
 IF @PLAN = 3 AND @PLAN_PRESTADOR = 1
    SET @PRESTACION = '01-01-01-99989'
 IF @PLAN = 3 AND @PLAN_PRESTADOR = 2
    SET @PRESTACION = '01-01-01-99988'
 IF @PLAN = 3 AND @PLAN_PRESTADOR = 3
    SET @PRESTACION = '01-01-01-99962'
INSERT INTO 
        CAP_TBL_DETALLE_ADICIONAL_ORDEN 
    VALUES( '001' , @NUMERO_ODA , 'PR' , 1 , '01' , '01', @PRESTACION , @VALOR_ODA , @PORCENTAJE , @VALOR_CUBIERTO , @VALOR_AFILIADO , '0101', 
 'A',@VALOR_ODA,3.29, @PLAN , '01' , 'Z10' , @tipo_prestador , @CODIGO_PRESTADOR , 1 , @VALOR_ODA , @VALOR_ODA, 0, @VALOR_ODA, @VALOR_ODA, 0, 0, 
 @VALOR_ODA, @porcentaje, @VALOR_AFILIADO, @VALOR_CUBIERTO) 

 update a               
set a.periodo_contrato = b.periodo              
from cap_tbl_ORDEN_ATENCION a,cap_tbl_periodos_por_contrato b               
where  a.ORDE_SUCU = '001' and a.ORDE_NUME = @NUMERO_ODA and              
a.ORDE_FECH between fecha_inicio and fecha_final and a.ORDE_COAN = B.anio and               
a.ORDE_COME = B.mes  and a.ORDE_COTI = B.tipo and a.ORDE_CONU = B.contrato   

insert into  tbl_consumos              
select sucursal,NUMERO,cod_cobertura,tipoprestacion,'000',sum(a.COBERTURA)              
from               
cap_tbl_detalle_ADICIONAL_ORDEN a              

where a.sucursal = '001' and A.NUMERO = @NUMERO_ODA

group by              
sucursal,A.NUMERO,cod_cobertura,TIPOPRESTACION        

select @tipo_s = sec_factura from CARTERA..ccb_tbl_caja where caja_sucu = '001' and usuario = 197 

SELECT @MAXIMO = SECUENCIA FROM CARTERA..CCB_TBL_SECUENCIA WHERE sucursal = '001' and TIPO = 'CA' 

IF @MAXIMO IS NULL 
SET @MAXIMO = 0 
SET @MAXIMO = @MAXIMO +1 

SELECT @NUMERO_FACTURA = SECUENCIA 
,@NRO_DOCUMENTO_P1= SECUENCIA_P1,@NRO_DOCUMENTO_P2= SECUENCIA_P2,@NRO_AUTORIZACION = 0 
 FROM CARTERA..CCB_TBL_SECUENCIA WHERE 
sucursal = '001' and 
TIPO = @TIPO_S 
IF @NUMERO_FACTURA IS NULL 
SET @NUMERO_FACTURA = 0 
SET @NUMERO_FACTURA = @NUMERO_FACTURA +1 


SET @NRO_DOCUMENTO_P3= RIGHT('0000000'+CONVERT(VARCHAR(10),@NUMERO_FACTURA),7) 

INSERT INTO CARTERA..CCB_TBL_CABECERA_RECIBO_CAJA 
VALUES('001', @MAXIMO, convert(date,@FECHA), @anio_contrato, @mes_contrato, @tipo_contrato, @numero_contrato, @codigo_contratante, 
    @VALOR_AFILIADO, 0, 0,0, 0,@VALOR_AFILIADO, '00', @fecha, 0, 'NV',@TIPO_S, @NUMERO_FACTURA, 'O', @NRO_DOCUMENTO_P1,@NRO_DOCUMENTO_P2,@NRO_DOCUMENTO_P3,
    @NRO_AUTORIZACION, @anio_afiliado,@mes_afiliado,@numero_afiliado,'O','O','001',0, 197,@FECHA,197, @fecha,
    CASE WHEN @TIPO_S IN ('F28','F30','F31','F32','F33','F34','F35','F36','F37') THEN 'I' ELSE NULL END ,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,'C' 

) 

UPDATE CARTERA..CCB_TBL_SECUENCIA SET SECUENCIA = SECUENCIA +1 
WHERE sucursal = '001' and TIPO = 'CA' 

UPDATE CARTERA..CCB_TBL_SECUENCIA SET SECUENCIA = SECUENCIA +1 
WHERE sucursal = '001' and TIPO = @TIPO_S 

INSERT INTO CARTERA..CCB_TBL_DETALLE_RECIBO_CAJA                                                            
VALUES('001', @MAXIMO, 1, @anio_contrato,@mes_contrato,@tipo_contrato,@numero_contrato,'03','001',@NUMERO_ODA,@VALOR_AFILIADO)

EXEC CARTERA..CCB_PRO_MAN_DETALLE_RECIBO_CAJA 'F', '001', @maximo

INSERT INTO CARTERA..CCB_TBL_FORMA_PAGO_RECIBO 
VALUES('001', 'OD', @MAXIMO, 1, '03', 'TJ', @ENTIDAD, @CUENTA, 0, @VALOR_AFILIADO, '00',0, convert(date,@FECHA) , 
    'A', @fecha, 0,0, '090', '000', '197', @fecha,'197',@fecha ,'' ,'N','N',1) 

select @NUMERO_ODA "NUMERO_ODA"```

1 Ответ

0 голосов
/ 10 июля 2019

Пояснение:

Одной из возможных причин, объясняющих это неожиданное поведение, является то, что ваша хранимая процедура, вероятно, возвращает несколько наборов результатов. Используйте sqlsrv_next_result () , чтобы сделать каждый результат активным.

<?php
...
// Call stored procedure
$sql = "exec TP_APP_WEB @CONTRATO = '2007061006201', @AFILIADO = '2007060389', @CODIGO_PRESTADOR = '00018', @OP = 'I'";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}

// Fetch data
do {
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        print_r($row, true);
    }
} while (sqlsrv_next_result($stmt));
...
?>

Примечания:

Если у вас есть операторы INSERT, DELETE или UPDATE, использование SET NOCOUNT ON в качестве первой строки в вашей хранимой процедуре предотвращает отправку информации о количестве затронутых строк в качестве набора результатов.

...