1. 程式人生 > >存儲過程常見錯誤合集

存儲過程常見錯誤合集

被調用 檢查 限制 沒有 date 數據 ace reat 作用

有如下存儲過程:

DROP PROCEDURE IF EXISTS pro_import_under_take_count;
CREATE PROCEDURE pro_import_under_take_count ()
BEGIN
/* 定義每月的第一天 */
DECLARE MonthFirstDay varchar(12) ;//定義的變量沒喲寫@符號,後期在使用的過程中也不要用使用@varible,直接寫成最原始定義的變量名,
DECLARE Month_now varchar(20) ;
DECLARE under_year varchar(4) ;
DECLARE under_month varchar
(2) ;//declare 定義的變量聲明一定要在select賦值語句的上面,不然創建存儲過程報錯!!!折磨了我大半天,謹記 DECLARE done INT DEFAULT 0; DECLARE totalRow INT DEFAULT 0; DECLARE orgid VARCHAR(50); /* 首先檢查每個部門工單表中是否有本月工作考核的數據 使用遊標進行遍歷*/ DECLARE result CURSOR FOR SELECT org_id FROM event_undertake GROUP BY org_id ; #HAVING under_take_time>[email protected]
MonthFirstDay AND under_take_time<[email protected]Month_now;//這是錯誤的,謹記!!! DECLARE CONTINUE HANDLER FOR SQLSTATE 02000 SET done = 1; SELECT DATE_FORMAT(NOW(), %Y-%m-01) INTO MonthFirstDay; //select賦值語句 變量值:“2017-09-03”格式 SELECT NOW() INTO Month_now; //select賦值語句 變量值:“2017-09-03 19:32:23”格式 SELECT DATE_FORMAT(NOW(),
%Y) INTO under_year; //select賦值語句 變量值:“2017”格式(獲取年份) SELECT DATE_FORMAT(NOW(), %m) INTO under_month; //select賦值語句 變量值:“09”格式(獲取月份) OPEN result; REPEAT FETCH result INTO orgid; IF done !=1 THEN /* 判斷該部門是否存在本月的承辦工單統計數據 */ SELECT COUNT(*) INTO totalRow from event_undertake_count euc WHERE euc.under_take_year=under_year AND euc.under_take_month=under_month AND euc.count_type=1 AND euc.org_id = orgid; IF totalRow != 0 THEN /*存在,進行更新操作*/ SET totalRow = 6; UPDATE event_undertake_count SET under_take_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now) ,not_end_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.end_status=0 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) ,end_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.end_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) ,on_time_end_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.over_time_status=0 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) ,over_time_end_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.over_time_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now) ,do_well_count=(SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.do_well_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now) WHERE under_take_year=under_year AND under_take_month=under_month AND count_type=1 AND org_id = orgid; ELSE /*不存在,進行插入操作*/ INSERT INTO event_undertake_count (id, org_id, under_take_year, under_take_month, count_type, under_take_count, not_end_count, end_count, on_time_end_count, over_time_end_count, do_well_count, create_time) SELECT (SELECT REPLACE (UUID(), -, ‘‘)) AS id, (SELECT orgid) AS org_id, (SELECT under_year) AS under_take_year, (SELECT under_month) AS under_take_month, (SELECT 1) AS count_type, (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS under_take_count , (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.end_status=0 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS not_end_count , (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.end_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS end_count , (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.over_time_status=0 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS on_time_end_count , (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.over_time_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS over_time_end_count , (SELECT COUNT(*) from event_undertake e WHERE e.org_id=orgid AND e.do_well_status=1 AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS do_well_count , (SELECT Month_now) AS create_time; END IF; /*ceshi */ #SELECT orgid,totalRow,under_year,under_month; END IF; UNTIL done END REPEAT; CLOSE result; #SELECT MonthFirstDay,Month_now,under_year,under_month; END #測試 CALL pro_import_under_take_count();

重要點:

1、遊標中 FETCH result INTO orgid; 中orgid不可以跟result中取出來的字段一樣,否則取不出來數據,(郁悶了我半天,午睡都沒有睡)

2、存儲過程定義declare只能放在最上面,其次是select語句;

3、SQL語句生產32位UUID:SELECT REPLACE(UUID(),‘-‘,‘‘) AS id;

4、select 查詢 涉及 where group by ,having 的時候,查詢的順序

select COUNT(*)as >20歲人數,classid  from Table1 where sex= group by classid,age having age>20 
  • 需要註意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:
  • 執行where子句查找符合條件的數據;
  • 使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最後用having 子句去掉不符合條件的組。
  • having 子句中的每一個元素也必須出現在select列表中(這一條很重要,又是坑了我半天)。有些數據庫例外,如oracle.
  • having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
  • having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以。

5、mysql中變量申明定義

  • DECLARE variable_name datatype(size) DEFAULT default_value; 此處聲明的相當於一個局部變量 ,在end 之後便失效。聲明多個變量:DECLARE x, y INT DEFAULT 0 ;
  • SET @num=19; SET @num:=19; //一個是"="進行賦值;另一個是使用“:=”進行賦值。此處的session變量不需要聲明,mysql會自動根據值類型來確定類型,這種變量要在變量名稱前面加上“@”符號,叫做會話變量,代表整個會話過程他都是有作用的,這個有點類似於全局變量一樣。這種變量用途比較廣,因為只要在一個會話內(就是某個應用的一個連接過程中),這個變量可以在被調用的存儲過程或者代碼之間共享數據。
  • select @num:=1; 或 select @num:=字段名 from 表名 where …… //比如:SELECT @num:= COUNT(*) FROM blog_note;
  • 註意上面兩種賦值符號,使用set時可以用“=”或“:=”,但是使用select時必須用“:=賦值”。

  

存儲過程常見錯誤合集