Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Использование sqlsrv с хранимыми процедурами / 9 сообщений из 9, страница 1 из 1
06.10.2018, 07:56
    #39713848
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
Здравствуйте.

Есть хранимая процедура. Да любая может быть хранимка в ней идёт сначала вставка в таблицу записи и далее select в ней.
При выполнении процедуры:

Код: php
1.
2.
3.
4.
5.
6.
if(!sqlsrv_execute($stmt))
       		return '0'; 
while($row = sqlsrv_fetch_array($stmt))
{
$l1 = $row['ErrorMessage'];
}



Вставка записи происходит, а строчку $l1 = $row['ErrorMessage']; не попадает (по отладчику смотрю).
Что можно сделать, всё же туда попадал?
...
Рейтинг: 0 / 0
06.10.2018, 08:26
    #39713851
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
попробуйте какой-нибудь sqlsrv_query вместо sqlsrv_execute
...
Рейтинг: 0 / 0
08.10.2018, 06:23
    #39714184
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
Здравствуйте. sqlsrv_query тоже не даёт это сделать.
...
Рейтинг: 0 / 0
08.10.2018, 11:35
    #39714312
SQLPowerUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
roma1975,

у меня тоже всё на хранимках
Попробуйте вывести на экран количество возвращаемых строк, текст ошибок и т.д.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?php

function formatErrors($errors) {
  foreach ($errors as $error) {
    echo 'Error: <span style="color:red; font:13px verdana;">Message: ' . $error['message'] . '</span><br><br>';
  }
}

function getConn() {
  $serverName = 'IP или имя';
  $connectionInfo = ["Database"=>"имя_базы", "UID"=>"sa", "PWD"=>"12345"];
  $conn = sqlsrv_connect($serverName, $connectionInfo);
  if ($conn === false) {die(formatErrors(sqlsrv_errors()));}
  return $conn;
}

  // Далее
  $conn = getConn();
  $s = "exec хранимка ?, ?";

  $params = [...];
  $options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
  $q1 = sqlsrv_query($conn, $s, $params, $options);
  if ($q1 === false) {die(formatErrors(sqlsrv_errors()));}

  print_r(sqlsrv_num_rows($q1)); // посмотреть кол-во строк

  while ($row = sqlsrv_fetch_array ($q1,SQLSRV_FETCH_ASSOC)) {
    print_r($row);
  }

  sqlsrv_free_stmt($q1);
  sqlsrv_close($conn);
...
Рейтинг: 0 / 0
08.10.2018, 13:49
    #39714395
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
Так в том то и дело, что ошибок нет, а в твою строку print_r($row); не попадает программа (смотрю по отладчику). Ты можешь тоже попробовать сделать любую хранимую процедуру, и в неё insert в таблицу и select любой и посмотреть.
...
Рейтинг: 0 / 0
08.10.2018, 14:00
    #39714402
SQLPowerUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
roma1975,

пробовал, работает

Там возвращается 2 датасета. Перейдите к тому, что возвращает select, через sqlsrv_next_result , типа такого
Код: php
1.
2.
3.
4.
5.
6.
7.
$row_count = sqlsrv_num_rows($stmt);
echo "Row count for First result set = $row_count <br>";

while (sqlsrv_next_result($stmt)) {
	$row_count = sqlsrv_num_rows($stmt);
	echo "Row count for Next result set = $row_count <br>";
}
...
Рейтинг: 0 / 0
09.10.2018, 07:31
    #39714735
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
Здравствуйте.

Да не получается.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 $sql = "exec [ivcws].[dbo].insertEdf42Kor_php ?,?,?,?,?,?,?,?";
  $options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
  $q1 = sqlsrv_query($db_link1, $sql, array($s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8), $options);
  if ($q1 === false) {return '0';}
  $row_count = sqlsrv_num_rows($q1);
  while (sqlsrv_next_result($q1)) {
   $l1 = $row['ErrorMessage'];
    }



хранимка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
CREATE PROCEDURE [dbo].[insertEdf42Kor_php]
@P1 int,
@P8 varchar(50),
@P9 varchar(50),
@P3 varchar(20),
@P4 varchar(50),
@P5 varchar(20),
@P6 varchar(20),
@P7 varchar(1)
AS
BEGIN try
	begin transaction
	
	insert into Edf42Kor
	(
	   
	   [lsh],
	   [kdu]      
	  ,[n_pol]
      ,[pol]
      ,[n_pach]
	  ,[datav]
      ,[ls1]
      ,[ls2]
      ,[kaz]
	  ,[ipadr1]
	  ,[mes]
	  ,prtek1
	  

	) values
	 (
	  @P5,
	  @P1, @P8, @P9,'I'+cast(@P1 as varchar(4))
	 ,@P3
	 ,@P5 
	 ,'онл КСК'
	 ,@P6
	 ,@P4 
	 ,MONTH ( getdate() )
	 ,@P7
	 )
	
	commit transaction
	SELECT 'OK' AS ErrorMessage; 
END try
begin catch
SELECT ERROR_MESSAGE() AS ErrorMessage; 
rollback transaction
end catch

GO



таблица:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE [dbo].[Edf42Kor](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[lsh] [varchar](7) NULL,
	[kdu] [numeric](4, 0) NULL,
	[n_pol] [numeric](3, 0) NULL,
	[pol] [nvarchar](50) NULL,
	[n_pach] [varchar](5) NULL,
	[v_corr] [varchar](1) NULL,
	[reg_v] [varchar](1) NULL,
	[mes] [numeric](2, 0) NULL,
	[datav] [datetime] NULL,
	[ls1] [varchar](7) NULL,
	[ls2] [varchar](7) NULL,
	[kaz] [numeric](1, 0) NULL,
	[ipadr1] [varchar](50) NULL,
	[sn1] [char](1) NULL,
	[prtek1] [numeric](1, 0) NULL
) ON [PRIMARY]



запуск из managment studio:
Код: sql
1.
exec [ivcws].[dbo].insertEdf42Kor_php '974','70','d','10.08.2018','11','0010014','0','0'
...
Рейтинг: 0 / 0
09.10.2018, 11:01
    #39714802
SQLPowerUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
roma1975,

чтобы заработало, поставьте в начало хранимки set nocount on ; http://www.sql.ru/faq/faq_topic.aspx?fid=111
Также рекомендую убрать ненужную транзакцию на вставку. Если insert не пройдет, то сервер сам откатит, и заодно выведет сообщение об ошибке, и в Вашем случае begin try и этот блок
Код: sql
1.
2.
3.
  begin catch
    select error_message() [ErrorMessage];
  end catch

тоже по сути лишнее.
Ошибки на экран выводятся из PHP функцией formatErrors . Ниже работающий код, в котором я всё-таки оставил try...catch
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
use test

if object_id('dbo.insertEdf42Kor_php') is not null drop procedure [dbo].[insertEdf42Kor_php]
go

Create procedure [dbo].[insertEdf42Kor_php]
  @P1 int,
  @P8 varchar(50),
  @P9 varchar(50),
  @P3 varchar(20),
  @P4 varchar(50),
  @P5 varchar(20),
  @P6 varchar(20),
  @P7 varchar(1)
as
Begin -- процедура insertEdf42Kor_php
  set nocount on;

  begin try
    insert into Edf42Kor (	   
      [lsh],
      [kdu]      
      ,[n_pol]
      ,[pol]
      ,[n_pach]
      ,[datav]
      ,[ls1]
      ,[ls2]
      ,[kaz]
      ,[ipadr1]
      ,[mes]
      ,prtek1
    ) values (
	    @P5,
	    @P1,
      @P8,
      @P9,
      'I'+cast(@P1 as varchar(4))
	    ,@P3
	    ,@P5 
	    ,'онл КСК'
	    ,@P6
	    ,@P4 
	    ,month(getdate())
	    ,@P7
    )
    select 'OK' [ErrorMessage];
  end try
  begin catch
    select error_message() [ErrorMessage];
  end catch
End -- процедура insertEdf42Kor_php
go


if object_id('dbo.Edf42Kor') is not null drop table [dbo].[Edf42Kor]
Create table [dbo].[Edf42Kor] (
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[lsh] [varchar](7) NULL,
	[kdu] [numeric](4, 0) NULL,
	[n_pol] [numeric](3, 0) NULL,
	[pol] [nvarchar](50) NULL,
	[n_pach] [varchar](5) NULL,
	[v_corr] [varchar](1) NULL,
	[reg_v] [varchar](1) NULL,
	[mes] [numeric](2, 0) NULL,
	[datav] [datetime] NULL,
	[ls1] [varchar](7) NULL,
	[ls2] [varchar](7) NULL,
	[kaz] [numeric](1, 0) NULL,
	[ipadr1] [varchar](50) NULL,
	[sn1] [char](1) NULL,
	[prtek1] [numeric](1, 0) NULL
) ON [PRIMARY]
go


exec [dbo].insertEdf42Kor_php '974','70','d','10.08.2018','11','0010014','0','0'

PHP
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?php
function utf8($s) {return iconv('windows-1251','utf-8//IGNORE',$s);}
function formatErrors($errors) {
  foreach ($errors as $error) {
    echo 'Error: <span style="color:red; font:13px verdana;">Message: ' . utf8($error['message']) . '</span><br><br>';
  }
}

function getConn() {
  $serverName = '.\sql2014';
  $connectionInfo = ["Database"=>"test", "UID"=>"sa", "PWD"=>"12345"];
  $conn = sqlsrv_connect($serverName, $connectionInfo);
  if ($conn === false) {die(formatErrors(sqlsrv_errors()));}
  return $conn;
}


$conn = getConn();
$sql = "exec [dbo].insertEdf42Kor_php ?,?,?,?,?,?,?,?";
$params = ['974','70','d','10.08.2018','11','0010014','0','0'];
$options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
$q1 = sqlsrv_query($conn, $sql, $params, $options);
if ($q1 === false) {die(formatErrors(sqlsrv_errors()));}

echo 'Кол-во строк = ', sqlsrv_num_rows($q1), '<br>';

while ($row = sqlsrv_fetch_array ($q1,SQLSRV_FETCH_ASSOC)) {
  echo '<pre>';
  print_r($row);
}

sqlsrv_free_stmt($q1);
sqlsrv_close($conn);

...
Рейтинг: 0 / 0
09.10.2018, 12:05
    #39714843
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование sqlsrv с хранимыми процедурами
Спасибо. Получилось.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Использование sqlsrv с хранимыми процедурами / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]