2013-03-10 2 views
0

Я создал тестовую базу данных следующим образом:PHP параметры хранимых процедур

USE test; 
DROP TABLE IF EXISTS test; 
DROP PROCEDURE IF EXISTS testparams; 
CREATE TABLE test 
(
    inparm INT, 
    inoutparam INT, 
    outparm INT 
); 

INSERT INTO test VALUES (0, 0, 0); 

DELIMITER $$ 
CREATE PROCEDURE testparams(IN i INT, INOUT io INT, OUT o INT) 
BEGIN 
    UPDATE test SET inoutparm = io + 1, outparm = FLOOR(RAND() * 1000) 
       WHERE inparm = i; 

    SELECT outparm INTO o FROM test WHERE inparm = i; 
    SELECT inoutparam INTO io FROM test WHERE inparm = i; 

END $$ 

Я также получил PHP скрипт:

<?php 

$c = new mysqli('localhost', 'test', 'test', 'test') or die('Cannot connect'); 
echo "Connected\n"; 

$in = 0; 
$out = -1; 
$inout = 3; 

echo "In: $in Out: $out: Inout: $inout\n"; 

$s = $c->prepare('CALL testparams(?, ?, ?)') or die('Unable to prepare: ' . $c->error); 
$s->bind_param('iii', $in, $inout, $out); 
#$s->bind_result($out, $inout); 
$s->execute(); 

echo "After execute SP\nIn: $in Out: $out: Inout: $inout\n"; 

echo "End of SP\n"; 
$s = $c->prepare('SELECT inparm, inoutparam, outparm FROM test'); 

# $s->bind_result($in, $inout, $out); - Get a error here 

$s->execute(); 
while ($s->fetch()) 
{ 
    echo "In: $in Out: $out: Inout: $inout\n"; 
} 

?> 

Моя проблема заключается в том, что хранимая процедура не кажется, называется. Это связано с использованием параметров OUT и INOUT? Если да, то как вы используете эти параметры с PHP?

Это демонстрируется с помощью сценария, создающего следующий вывод

Connected 
In: 0 Out: -1: Inout: 3 
End of SP 
In: 0 Out: 0: Inout: 0 
+1

Возможно, вы имели в виду SELECT inoutparam INTO io FROM test WHERE inparm = i; где это INTO io, а не INTO o. – ckim

+0

Спасибо - Сделано изменение - Моя ошибка. Но все равно не работает. –

ответ

1

CALL Syntax

Для программ, написанных на языке, который обеспечивает интерфейс MySQL, нет нативного метода для непосредственного получения результатов параметров OUT или INOUT от заявлений вызова. Чтобы получить значения параметров, передать пользовательские переменные процедуре в инструкции CALL и , затем выполнить оператор SELECT для создания набора результатов, содержащего значения переменной . Чтобы обрабатывать параметр INOUT, выполните оператор до CALL, который устанавливает соответствующую пользовательскую переменную в значение , которое должно быть передано процедуре.

Это, кажется, изменились в MySQL 5.6

В MySQL 5.6, программа C может использовать интерфейс изготовленного заявления в выполнять операторы вызова и доступ OUT и параметры INOUT. ... Языки, предоставляющие интерфейс MySQL, могут использовать подготовленные операторы CALL для непосредственного получения параметров процедуры OUT и INOUT.

Это будет делать это

<?php 

$c = new mysqli('localhost', 'test', 'test', 'test') or die('Cannot connect'); 
echo "<pre>Connected<br>"; 

$in = 0; 
$out = -1; 
$inout = 3; 

echo "Before executing SP<br>In: $in Inout: $inout Out: $out<br>"; 

$s = $c->prepare('SET @i = ?, @io = ?') or die('Unable to prepare: ' . $c->error); 
$s->bind_param('ii', $in, $inout); 
$s->execute(); 

$s = $c->prepare("CALL testparams(@i, @io, @o)") or die('Unable to prepare: ' . $c->error); 
$s->execute(); 

$s = $c->prepare('SELECT @io, @o'); 
$s->execute(); 
$s->bind_result($inout, $out); 
$s->fetch(); 

echo "After execute SP<br>In: $in Inout: $inout Out: $out<br>"; 

echo "End of SP<br></pre>"; 

?> 

Выход

Connected 
Before executing SP 
In: 0 Inout: 3 Out: -1 
After execute SP 
In: 0 Inout: 4 Out: 851 
End of SP 

Кстати, есть опечатка в СП. Эта линия

UPDATE test SET inoutparm = io + 1, outparm = FLOOR(RAND() * 1000) 

должен быть

UPDATE test SET inoutparam = io + 1, outparm = FLOOR(RAND() * 1000) 
         ^
+0

Это имена столбцов таблиц. Этот бит работает и извлекает содержимое таблиц. Бит, который не работает, вызывает SP. –

+0

@EdHeal См. Обновленный ответ. – peterm

+0

@EdHeal Помогло ли это? – peterm

0

«SSS» должно быть «III», так как вы имеете дело с целыми числами, а не строк.

+0

Я сделал обновление, но параметры out/inout хранимой процедуры не работают. –

1

Я думаю $s->bind_param('sss', $in, $inout, $out); должно быть

;

+0

Упс - Амир - Спасибо. Обновлено изменение - я строил из более сложного примера. Но после этого изменения параметров out/inout не меняются. –

Смежные вопросы