1. 程式人生 > >mysql 儲存過程, 變數定義等。

mysql 儲存過程, 變數定義等。

convert  Cast函式

兩者具體的語法如下:

Cast(value as type); Convert(value ,type);

type不是都可以滴,可以轉換的type如下:

二進位制,同帶binary字首的效果 : BINARY    
字元型,可帶引數 : CHAR()     
日期 : DATE     
時間: TIME     
日期時間型 : DATETIME     
浮點數 : DECIMAL      
整數 : SIGNED     
無符號整數 : UNSIGNED 

儲存過程寫法例項
在mysql客戶端定義儲存過程的時候使用delimiter命令來把語句定界符從;變為//。
當使用delimiter命令時,你應該避免使用反斜槓(‘"’)字元,因為那是MySQL的轉義字元。
delimiter //
//

如果需要傳遞引數 則如此   

create procedure test3(IN  id int, OUT pname varchar(10)) 
begin   
    select user_name into pname from test where id = id; 
end 
delimiter //
drop PROCEDURE if EXISTS update_error_stock;
CREATE PROCEDURE update_error_stock()
BEGIN 
  /*遊標取完後的標識變數done_cursor置為1 */ 
  DECLARE done_cursor INT DEFAULT 0 ;
  DECLARE goods_id_temp, order_sum_number,stock_sum_number INT;
  /*所有已經付款的商品的id號*/
	DECLARE cur1 CURSOR FOR (SELECT distinct og.goods_id FROM  ecs_order_info as of  inner join  ecs_order_goods as og on of.order_id =og.order_id where of.pay_status=2);
  
  /*遊標宣告必須在HANDLER之前 */
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_cursor=1;

		/*mysql中變數沒有事前申明 使用set 可以用:= = 使用 select賦值必須 := convert((
[email protected]
_sum_number),SIGNED); */ /*迴圈取值 更新庫存*/ OPEN cur1; REPEAT FETCH cur1 INTO goods_id_temp; SELECT sum(og.goods_number) into order_sum_number FROM ecs_order_info as of inner join ecs_order_goods as og on of.order_id =og.order_id where of.pay_status=2 and og.goods_id=goods_id_temp; SELECT convert((500-order_sum_number),SIGNED) INTO stock_sum_number ; update ecs_goods set goods_number=stock_sum_number where goods_id=goods_id_temp and goods_number > 500; set order_sum_number=0; set stock_sum_number=0; UNTIL done_cursor END REPEAT; CLOSE cur1; END // call update_error_stock;


PROCEDURE 2 來自 mysql 手冊
drop PROCEDURE if EXISTS curdemo;
CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM t2;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;


  OPEN cur1;
  OPEN cur2;


  REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO t3 VALUES (a,b);
       ELSE
          INSERT INTO t3 VALUES (a,c);
       END IF;
    END IF;
  UNTIL done END REPEAT;


  CLOSE cur1;
  CLOSE cur2;
END;


call curdemo;
mysql 變數定義 (轉)

在select中,發現有一個使用者變數,如果沒有定義,那麼就會初始化。select子句原來的方式根本不受到影響。只是增加了使用者變數。所以,還是按照原來的方式使用select子句。那麼像:select sum(amount) from penalties。增加變數就成了:select  @VAR:=sum(amount) from penalties。將sum(amount)的結果賦給變數@VAR:。變數前面有select,那使用者麼就是顯示該變量了。
mysql變數的術語分類:
1.使用者變數:以"@"開始,形式為"@變數名"
使用者變數跟mysql客戶端是繫結的,設定的變數,只對當前使用者使用的客戶端生效
2.全域性變數:定義時,以如下兩種形式出現,set GLOBAL 變數名  或者  set @@global.變數名
3.會話變數:只對連線的客戶端有效。
4.區域性變數:作用範圍在begin到end語句塊之間。在該語句塊裡設定的變數
declare語句專門用於定義區域性變數。set語句是設定不同型別的變數,包括會話變數和全域性變數

相關推薦

mysql 儲存過程, 變數定義

convert  Cast函式 兩者具體的語法如下: Cast(value as type); Convert(value ,type); type不是都可以滴,可以轉換的type如下: 二進位制,同帶binary字首的效果 : BINARY     字元型,可帶引數

SQL語句優化,索引,檢視,觸發器,儲存過程,函式

    一,SQL優化        主要解決海量資料操作時的全表搜尋,所以減少不必要的全表搜尋是SQL優化的主要目的,下面總結一下常用的優化有哪些:        1,避免在where條件中使用!=或者<>,這樣會是的查詢放棄索引而進行全域性掃描       

mysql儲存過程、檢視的許可權問題

看儲存過程定義,DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `DB_U1`.`P1`() /*LANGUAGE SQL | [NOT] DETE

MySQL儲存過程中declare和set定義變數的區別

  在儲存過程中常看到declare定義的變數和@set定義的變數。簡單的來說,declare定義的類似是區域性變數,@set定義的類似全域性變數。  1、declare定義的變數類似java類中的區域性變數,僅在類中生效。即只在儲存過程中的begin和end之間生效。  2

mysql儲存過程中 declare 和 set 定義變數的區別

mysql儲存過程中,定義變數有兩種方式: 1.使用set或select直接賦值,變數名以 @ 開頭. 例如:set @var=1; 可以在一個會話的任何地方宣告,作用域是整個會話,稱為會話變數。 2.以 DECLARE 關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過

MySQL儲存過程中,定義變數有兩種方式

MySQL儲存過程中,定義變數有兩種方式: 1.使用set或select直接賦值,變數名以 @ 開頭. 例如:set @var=1; 可以在一個會話的任何地方宣告,作用域是整個會話,稱為會話變數。

Mysql儲存過程2:變量定義與參數傳遞

變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de

MySQL-儲存過程程式碼筆記-in、out、inout、declare區域性變數和if...else語句

mysql> use test; Database changed mysql> show tables; Empty set (0.00 sec) mysql> use test; Database changed mysql> create table testA

5分鐘學會MySQL儲存過程_1、定義及應用場景

                                          &nb

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

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

mysql儲存過程判斷不為空和不為空,查詢結果賦值變數

直接看例子,判斷為空是is null delimiter // create procedure proc__pre_activity_scan() begin    declare p_tid int(10);    set @p_tid=(select tid fro

MySQL儲存過程(格式,變數,引數,流程控制...)

儲存過程 其實就是mysql語句組成的指令碼,也就是資料庫中儲存的一系列SQL命令的集合。 可以使用變數,條件判斷,流程控制等 優點 提高效能 減輕網路負擔 可以防止對錶的直接訪問 避免重複編寫SQL操作

mysql儲存過程中使用select count(*) into 變數名 from +表+ where條件的用法

select count(*) into v_count from dual where userid=2;此語句的意思就是根據where條件查詢dual表,得到的行數存入變數v_count中(給變數賦值) 只能在儲存過程中編寫這樣的語句?如果在mysql的sql語句中編寫

mysql儲存過程查詢結果迴圈遍歷 判斷 賦值 遊標基本操作

一、首先說下本篇部落格所實現功能的背景和功能是怎樣的:       背景:因為公司專案開始遷移新平臺專案,所以以前的平臺老資料以及訂單資訊需要拆分表,而且需要業務邏輯來分析以前的訂單表,來拆分成另外的幾個新表,包括增加新的流水分析,以及更新其他使用者或者商家的餘額以及對賬

mysql儲存過程+遊標迴圈遍歷 判斷 賦值 例項一

CREATE DEFINER=`admin`@`%` PROCEDURE `updateRecommended`() BEGIN DECLARE my_recommended INT; DECLARE my_id INT; DECLARE inviteRelationStr VARCHAR(10000)

MySQL儲存過程/儲存過程與自定義函式的區別

儲存過程:簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;ps:儲存過程跟觸發器有點類似,都是一組SQL集,但是儲存過程是主動呼叫的,且功能比觸發器更加強大,觸發器是某件事觸發後自動呼叫;有哪些特性:有輸入輸出引數,可以宣

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

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

mysql儲存過程定義

1.執行update mysql.proc set DEFINER='[email protected]%'WHERE NAME='p_update_rim_batch_log'AND db='otherdataonline';NAME:函式名字、不填所有的DB:所

mysql儲存過程簡單例項 變數賦值 遊標遍歷

應用場景: 有兩張表,學生表和對應的各科成績表。 學生表student 欄位:id int, name varchar(20)數值:              1             A              2             B  成績表score 欄

解決 mysql 儲存過程查詢資料方式是變數拼接表名的寫法

需求: 用儲存過程查詢動態表名的資料 遇到問題: 查詢語句 from後面不能直接用引數查詢 MYSQL不支援直接使用變數做表名,會把引數名當做表名查詢,報錯 解決方法: 把查詢語句和變數通過concat連線付給變數。通過執行變數來執行此語句 sql程式碼: