Procedimentos armazenados do MySQL que retornam vários valores

 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 INOUTou .OUT

Se você não estiver familiarizado com os parâmetros INOUTou 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 orderstabela 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';

ENDLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Dentro do procedimento armazenado, utilizamos uma SELECTinstrução com a COUNTfunçã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_custprocedimento 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 SELECTinstruçã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 )
Procedimentos armazenados do MySQL que retornam vários valores

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *