Resumo : neste tutorial você aprenderá como desenvolver procedimentos armazenados que retornam vários valores.
A função armazenada do MySQL retorna apenas um valor. Para desenvolver programas armazenados que retornam vários valores, você precisa usar procedimentos armazenados com parâmetros INOUT
ou .OUT
Se você não estiver familiarizado com os parâmetros INOUT
ou OUT
, consulte o tutorial sobre parâmetros do procedimento armazenado para obter informações detalhadas.
Exemplo de procedimentos armazenados que retornam vários valores
Vamos dar uma olhada na orders
tabela no banco de dados de exemplo :
O seguinte procedimento cria um procedimento armazenado que aceita o número do cliente e retorna as contagens de pedidos com diferentes status (enviados, cancelados, resolvidos, contestados) para esse cliente:
DELIMITER $$
CREATE PROCEDURE get_order_by_cust(
IN cust_no INT,
OUT shipped INT,
OUT canceled INT,
OUT resolved INT,
OUT disputed INT)
BEGIN
-- shipped
SELECT
count(*) INTO shipped
FROM
orders
WHERE
customerNumber = cust_no
AND status = 'Shipped';
-- canceled
SELECT
count(*) INTO canceled
FROM
orders
WHERE
customerNumber = cust_no
AND status = 'Canceled';
-- resolved
SELECT
count(*) INTO resolved
FROM
orders
WHERE
customerNumber = cust_no
AND status = 'Resolved';
-- disputed
SELECT
count(*) INTO disputed
FROM
orders
WHERE
customerNumber = cust_no
AND status = 'Disputed';
END
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Dentro do procedimento armazenado, utilizamos uma SELECT
instrução com a COUNT
função de recuperar o número total de pedidos correspondente ao status de cada pedido e atribuí-lo ao respectivo parâmetro.
Para usar o get_order_by_cust
procedimento armazenado, você passa o número do cliente e quatro variáveis definidas pelo usuário para obter os valores de saída.
Depois de executar o procedimento armazenado, você usa a SELECT
instrução para gerar os valores das variáveis.
CALL get_order_by_cust(141,@shipped,@canceled,@resolved,@disputed);
SELECT @shipped,@canceled,@resolved,@disputed;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Chamando procedimentos armazenados que retornam vários valores do PHP
O trecho de código a seguir mostra como chamar o procedimento armazenado que retorna vários valores do PHP.
<?php
/**
* Call stored procedure that return multiple values
* @param $customerNumber
*/
function call_sp($customerNumber)
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=classicmodels", 'root', '');
// execute the stored procedure
$sql = 'CALL get_order_by_cust(:no,@shipped,@canceled,@resolved,@disputed)';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':no', $customerNumber, PDO::PARAM_INT);
$stmt->execute();
$stmt->closeCursor();
// execute the second query to get values from OUT parameter
$r = $pdo->query("SELECT @shipped,@canceled,@resolved,@disputed")
->fetch(PDO::FETCH_ASSOC);
if ($r) {
printf('Shipped: %d, Canceled: %d, Resolved: %d, Disputed: %d',
$r['@shipped'],
$r['@canceled'],
$r['@resolved'],
$r['@disputed']);
}
} catch (PDOException $pe) {
die("Error occurred:" . $pe->getMessage());
}
}
call_sp(141);
Linguagem de código: PHP ( php )
As variáveis definidas pelo usuário, que são precedidas do @
sinal, estão associadas à conexão com o banco de dados, portanto, ficam disponíveis para acesso entre as chamadas.
Neste tutorial, mostramos como desenvolver um procedimento armazenado que retorna vários valores e como chamá-lo a partir do PHP.