1. 程式人生 > >儲存過程之多項結果集遊標處理

儲存過程之多項結果集遊標處理

http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#cursors

以下的文章主要介紹的是MySQL遊標的使用筆記,其可以用在儲存過程的SQL語句,其主要型別主要有以下幾種,以下就是對其詳細介紹,相信如果你掌握了這項技術,會在以後的學習或是工作中帶來很大的幫助。

1、 無返回結果語句,如:INSERT,UPDATE,DROP, DELETE等

2、 select語句返回單行變數並可傳給本地變數(select ..into)

3、 返回多行結果集的select語句,並可使用MySQL遊標迴圈處理

注意,儲存過程返回的多行結果集,可以被客戶端程式(如php)所接收,但要在一個儲存過程中接收另一個儲存過程的結果集是不可能的,一般解決辦法是存入臨時表供其它過程共用

4、 prepare語句

以下主要講述遊標及prepare部分

遊標

定義

  1. DECLARE cursor_name CURSOR FOR SELECT_statement; 

遊標操作

OPEN 開啟遊標

  1. OPEN cursor_name; 

FETCH獲取遊標當前指標的記錄,並傳給指定變數列表,注意變數數必須與MySQL遊標返回的欄位數一致,要獲得多行資料,使用迴圈語句去執行FETCH

  1. FETCH cursor_name INTO variable list; 

CLOSE關閉遊標

  1. CLOSE cursor_name ; 

注意:MySQL的遊標是向前只讀的,也就是說,你只能順序地從開始往後讀取結果集,不能從後往前,也不能直接跳到中間的記錄.

一個完整的例子:

定義本地變數

  1. DECLARE o varchar(128); 

定義遊標

  1. DECLARE ordernumbers CURSOR 
  2. FOR  
  3. SELECT callee_name FROM account_tbl where acct_timeduration=10800
  4. DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1
  5. SET no_more_departments=0

開啟遊標

  1. OPEN ordernumbers; 

迴圈所有的行

  1. REPEAT  
  2. -- Get order number 
  3. FETCH ordernumbers INTO o; 
  4. update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg[email protected]

迴圈結束

  1. UNTIL no_more_departments 
  2. END REPEAT; 

關閉遊標

  1. CLOSE ordernumbers; 

以上的相關內容就是對MySQL遊標使用筆記的介紹,望你能有所收穫。

變數定義:

declare variable_name [,variable_name...] datatype [defaultvalue];


其中,datatype為mysql的資料型別,如:int, float, date, varchar(length)

例:

declare l_int int unsigned default 4000000; declare l_numericnumeric(8,2) default 9.95; declare l_date date default'1999-12-31'; declare l_datetime datetime default '1999-12-3123:59:59'; declare l_varchar varchar(255) default 'this will not bepadded';

變數賦值

set 變數名 = 表示式值 [,variable_name = expression ...]
 

引數

mysql儲存過程的引數用在儲存過程的定義,共有三種引數型別,in,out,inout

create procedure|function([[in |out |inout ] 引數名 資料類形...])

in 輸入引數

表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值

out 輸出引數

該值可在儲存過程內部被改變,並可返回

inout 輸入輸出引數

呼叫時指定,並且可被改變和返回


建儲存過程:

語法:

create procedure p()

begin

end  
create procedure productpricing()

begin

    selectavg(pro_price) as priceaverage

   from products;

end;

# begin…end之間是儲存過程的主體定義

# mysql的分界符是分號(;) 

呼叫儲存過程的方法是:

# call加上過程名以及一個括號

# 例如呼叫上面定義的儲存過程

call productpricing();

相關推薦

儲存過程結果遊標處理

http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#cursors 以下的文章主要介紹的是MySQL遊標的使用筆記,其可以用在儲存過程的SQL語句,其主要型別主要有以下幾種,以下就是對其詳細介紹,相信如果你掌握了這項技術,會在以後的學習或

oracle呼叫儲存過程和函式返回結果

在程式開發中,常用到返回結果集的儲存過程,這個在MySQL和sql server 裡比較好處理,直接返回查詢結果就可以了,但在Oracle裡面 要 out 出去,就多了一個步驟,對於不熟悉的兄弟們還得出上一頭汗:),這裡我簡單介紹一下,以供參考,   1  定義包      

Oracle儲存過程層巢狀遊標的用法

Oracle sql指令碼程式碼   CREATE OR REPLACE   PROCEDURE P_DELETE_QK (pId in NUMBER, deep in NUMBER) AS   -- pId = 分類ID  deep = 深度,層級   on

在SQL中直接使用儲存過程查詢返回的結果

在實際使用儲存過程是,有時我們希望先判斷儲存過程的返回結果集是否有記錄,然後走不同的業務邏輯,這是就需要在SQL語句中直接讀取到儲存過程的返回結果集,方式如下: 先按照儲存過程結果集定義一個變數 declare @tbl table(門診號 varchar(20), 住院號

如何將儲存過程執行後的結果放入臨時表

如果能夠得到儲存過程結果集的表結構insert into #tmp exec sp_who 否則select * into #tmp from OPENROWSET('SQLOLEDB','SERVER=server;uid=sa;pwd=sapwd;Database=mas

mybaties呼叫mysql儲存過程儲存過程返回個select結果

先看需求,直接上圖 從圖中看出,需要12條普通的SELECT語句,所以就放到儲存過程中 儲存過程如下: DROP PROCEDURE IF EXISTS proc_report; DELIMITER $ CREATE PROCEDURE proc_report( OUT d_norma

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

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

SSM-Mybatis呼叫Oracle儲存過程返回結果(遊標)示例

1.建立一個包 此處建立一個包,是為了建立儲存過程時,用遊標作為out輸出引數時宣告為遊標型別用的. --建立一個包 create or replace package types as type empListCursor is ref cursor

Java獲取儲存過程返回的結果

第一步:寫你的儲存過程  delimiter //  create procedure test_proc ()  begin      select * from test_table1 where id=1;      select * from test_table

jdbc取mysql儲存過程結果

 先來返回結果格式: [ [ {"name":"分管公司1","id":"1000"}, {"name":"分管公司2","id":"1001"}, {"name":"分管公司3","id":"1014"},

java獲取儲存過程返回的結果(結果)

在.net中,DataSet可以自動接收多個結果集,形成DataTable陣列。 使用JAVA時,也想要實現這個效果,百度一頓查詢,終於找到解決的辦法。 核心方法:CallableStatement     ResultSet 具體實現程式碼: import java.s

mysql儲存過程返回個值

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

oracle 儲存過程 open 遊標 for with t2 as ()

在專案中見到這樣的儲存過程程式碼: procedure    procedure_name (out_param  out   cursorType,  out_param2  out   cursorType,  in_param  in   cursorType )

MySQL儲存過程遊標的使用

示例:把表中status為0所對應的age值改為99(當然有更簡單的方法,這裡主要是為了學習MySQL儲存過程中游標的使用) 先建表如下: /* 在test庫下建立testb表 */ CREATE

gitlab+jenkins+maven+docker持續集成(十)——參數化構建過程環境tag構建

gitlab+jenkins+maven+docker持續集成(十)——參數化構建過程之多環境tag構建同一個項目,要構建到不同的環境,而且對應的分支或tag也不相同,這裏就要用到jenkins的參數化構建過程 中的Git Parameter和Choice Parameter, 先看下效果實現過程構建過程:G

[SQL]sql server中如何直接查詢存儲過程EXEC返回的結果

arc div lec rom 結果 In varchar SQ type Declare @T Table (iDay VARCHAR(4),iNum DECIMAL(18,2),yuxiang DECIMAL(18,9))

結果 union

使用 後來 兩個 當前時間 rec 查詢 union和 計劃 判斷 之前物流發布計劃的展示是按照失效時間降序排列的.但是後來我們需要讓沒有過期的發布計劃升序排列,過期了的發布計劃降序排列.這種要求如果要在一個查詢裏實現的話我暫時還沒有思路,所以我使用union拼接兩個查詢結

sql中連線結果查詢符合要求的欄位

1.sql中將查詢到的結果集作為一個表去連線多個結果集查詢想要的欄位,適用於查詢複雜邏輯的欄位; 舉例: select dd.base_grade_value,count(distinct dd.userid) from  (select cc.school_id,bb.us

Java判斷ResultSet結果是否為空

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL儲存過程while、repeat迴圈

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