1. 程式人生 > >mysql儲存過程之返回多個值

mysql儲存過程之返回多個值

mysql儲存函式只返回一個值。要開發返回多個值的儲存過程,需要使用帶有INOUTOUT引數的儲存過程。咱們先來看一個orders表它的結構:

mysql> desc orders;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| orderNumber    |
int(11) | NO | PRI | NULL | | | orderDate | date | NO | | NULL | | | requiredDate | date | NO | | NULL | | | shippedDate | date | YES | | NULL | | | status | varchar(15) | NO | | NULL | |
| comments | text | YES | | NULL | | | customerNumber | int(11) | NO | MUL | NULL | | +----------------+-------------+------+-----+---------+-------+ 7 rows in set

然後嘞,咱們來看一個儲存過程,它接受客戶編號,並返回發貨(shipped),取消(canceled),解決(resolved)和爭議(disputed)的訂單總數:

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

其實,除IN引數之外,儲存過程還需要4個額外的OUT引數:shipped, canceled, resolveddisputed。 在儲存過程中,使用帶有count函式的select語句根據訂單狀態獲取相應的訂單總數,並將其分配給相應的引數。按著上面的sql,我們如果要使用get_order_by_cust儲存過程,可以傳遞客戶編號和四個使用者定義的變數來獲取輸出值。執行儲存過程後,我們再使用SELECT語句輸出變數值:

+----------+-----------+-----------+-----------+
| @shipped | @canceled | @resolved | @disputed |
+----------+-----------+-----------+-----------+
|       22 |         0 |         1 |         1 |
+----------+-----------+-----------+-----------+
1 row in set

結合實際應用,我們再來看下從PHP程式中呼叫返回多個值的儲存過程:

<?php
/**
 * Call stored procedure that return multiple values
 * @param $customerNumber
 */
function call_sp($customerNumber)
{
    try {
        $pdo = new PDO("mysql:host=localhost;dbname=yiibaidb", 'root', '123456');

        // 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);

上述程式碼中,在@符號之前的使用者定義的變數與資料庫連線相關聯,因此它們可用於在呼叫之間進行訪問。

好啦,本次分享就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。

相關推薦

mysql儲存過程返回

mysql儲存函式只返回一個值。要開發返回多個值的儲存過程,需要使用帶有INOUT或OUT引數的儲存過程。咱們先來看一個orders表它的結構:mysql> desc orders; +----------------+-------------+------+----

mysql使用儲存過程返回

可以使用OUT、INOUT引數型別讓儲存過程返回多個結果值,儲存函式不能勝任,因為只能返回一個值。比如統計student資料表裡男生和女生人數並通過它的引數返回這兩個計數值,讓呼叫者可以訪問它們: delimiter $$ create procedure count_st

python基礎函式返回的方法

例: >>> def test(): a=11 b=22 c=33 return a #多個return,語法不會報錯,但是隻執行第一個return return b #不會執行此條語句 return c #不會執行此條語句 >>> num

mysql儲存過程例項,查詢引數賦

drop procedure if exists p_for_create_customer; create procedure p_for_create_customer()begin declare ii int default 0; declare i int default 1; declare

mysql儲存過程變數(建立(DECLARE)和賦(SET))

    我們都知道,變數是一個命名資料物件,變數的值可以在儲存過程執行期間更改。我們接下來就嘗試使用儲存過程中的變數來儲存直接/間接結果。 這些變數是儲存過程的本地變數,但是我們得注意,變數必須先聲明後

mybatis呼叫mysql儲存過程返回引數,單結果集,結果集)

一、接收一個返回值 使用Map接收返回引數,output引數放在傳入的param中 建立表 DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMEN

lua函數返回

less logs msg exec eat 函數返回 sta cpp then function CompareString(in_source, in_compare) local ret_value; local ret_msg; if (in_sourc

Python 返回+Lambda的使用

最大值 imp from return post 一個 lambda turn mat def MaxMin(a,b): if(a>b): return a,b else: return b,a max,min=Ma

Python返回

() class turn urn pytho emp bsp nbsp code 1 def get_abc(): 2 a = 1 3 b = 2 4 c = 3 5 return a,b,c 6 7 temp = get_abc()

MySQL儲存過程while、repeat迴圈

一、while迴圈 CREATE DEFINER=`root`@`localhost` PROCEDURE `PRO_WHILE`() BEGIN DECLARE i INT DEFAULT 0; WHILE (i<10) DO /*當滿足條件的時候執行此程式碼塊*/ BE

用結構體指標做函式形參實現返回(fishing_6)

        最近在學ST32驅動數字攝像頭OV2640的實驗,無意中遇到了函式返回多個值的情況,決定Mark一下,說不定以後就會用到,因為一般函式都是隻有一個返回值的嘛,具體如下:         首先在標頭檔案定義結構體:                 typed

mysql 儲存過程使用遊標執行一條記錄

今天在寫資料遷移的儲存過程發現總會多執行一條記錄修改後記錄如下: DECLARE notfoundroute INT DEFAULT 0; declare route_cursor CURSOR FOR select uid, uteamid, iday, ctitle, ctrip, ct

Javascript函式返回

                Javascript函式返回多個值左直拳我從來就沒有真正掌握過Javascript,又或許是Javascript不斷地在發展,有好多東西看起來常常令我覺得十分驚奇。比如說,在網上看到一條Javascript語句:Return [a,b,c,d];這是返回語句,可是它有對方括號,

c# 方法返回用out

該方法返回   a+10   和   a-10   的結果,返回兩個值: public  static  void  GetValue( int a , out int b , out

mysql儲存過程迴圈遍歷查詢結果集

-- 建立儲存過程之前需判斷該儲存過程是否已存在,若存在則刪除 DROP PROCEDURE IF EXISTS init_reportUrl; -- 建立儲存過程 CREATE PROCEDURE init_reportUrl() BEGIN -- 定義變數 DECLARE s int

ORACLE 儲存過程遊標返回

1、過程主體 --儲存過程迴圈 ,SELECT INTO 是隱式遊標只能返回一行 CREATE OR REPLACE PROCEDURE P_LOOP_PR ( P_TIME NUMBER) IS A_OVER NUMBER; A_NAME VARCHAR2(20); BE

函式變相做到返回的方法

 2方法1:利用全域性變數        分析:全域性變數作為C語言的一個知識點,雖然我們都瞭解它的特點,但在實際教學過程中應用得並不是很多。由於全域性變數的作用域是從定義變數開始直到程式結束,而對於編寫有多個返回值的C語言函式,我們可以考慮把要返回的多個值定義成全域性變

4.2 使用元組-返回

parse_int(List) -> parse_int(skip_to_int(List), 0). parse_int([H|T], N) when H >= $0, H =< $9 -> parse_int(T, 10 * N + H - $0);

java如何從方法返回

import java.util.HashMap; import java.util.Map; public class Test { /** * 方法1:使用集合類 (Map以外的集合類也可以隨意使用) * 目標:返回一個數組的最大值和最小值 */ pu

MySQL儲存過程從另外兩表中取資料存整合其他資料儲存在一張新的表裡

業務需求: 通過傳入的引數x 從A表拿A.NAME(唯一一條記錄),從B表拿B.ID,B.NAME(多條記錄),儲存至C表。 DROP PROCEDURE IF EXISTS P_AUTO_SCHEDULING; CREATE PROCEDURE P_AUTO_SCHED