1. 程式人生 > >mysql 儲存過程1064問題和事例

mysql 儲存過程1064問題和事例

今天晚上室友說我看看你寫的那個框架,聽說查詢十萬條資料只需要幾秒鐘,我當然願意展示,開始準備環境:

在公司我是用的oracle,我就把寫的儲存過程拿出來在我本地的mysql中執行,結果一執行報錯:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'proone()' at line 1

一直報1064  我在網上找了很久,說需要重新定義mysql的結束符號,mysql預設結束是“;”結束

建立儲存過程必須在某個資料庫下。

我寫的儲存過程:

mysql> delimiter $
mysql> create procedure proone()
    -> begin
    -> declare i int;
    -> set i = 0;
    -> while i < 100000 do
    -> insert into tb_testone (id,name,test_id) values (i,'你妹',1);
    -> set i = i+1;
    -> end while;
    -> end $
Query OK, 0 rows affected


mysql> delimiter ;

我剛開始的時候儲存過程的名稱沒有加()也會報錯,儲存過程命名規則***()

刪除儲存過程 :  drop procedure proone;

呼叫儲存過程: CALL proone();

以上均是本人做過測試,確定好用,本人用的mysql 是5.5的版本。

後面再加點在網上找的儲存過程案例:

下面是一個最簡單的MySQL儲存過程,實現兩個數相加

delimiter $$ create procedure proc_add(in aint,in bint) begin declare cint; if a is null then set a = 0; end
 if; if b is null then set b = 0; end if;    set c = a + b; select c; end$$ delimiter ;

需要特別注意的是 

1. declare語句只能放在儲存過程的開始位置,放在後面就會報錯 
2. if 語句的後面必須有then,但是不需要begin,在if結束時需要end if 
3. 判斷是否為NULL倒是和MSSQL一樣都有IS NULL 
4. delimiter是定界符的意思在結束的end後面要新增定界符 
5. end if之後必須跟分號,否則語法錯誤 

下面是一個較常見的場景,判斷表中某列是否存在某值,如果存在執行某操作 

delimiter $$ create procedure proc_add_book(in $bookNamevarchar(200),in $pricefloat) begin declare $existsFlagint default 0; select bookIdinto $existsFlagfrom bookwhere bookName = $bookName limit 1; if bookId > 0 then #ifnot exists (select *from bookwhere bookNumber = $bookName) then insert into book(bookNumber,price)values($bookName,$price); end if; end$$ delimiter ;

需要注意的是不能用if exists;exists可以在where後面或者在create object是使用,但是在if語句中不可以使用,只能用變通的方法。

while語句也需要注意,下面是一個while的簡單應用:

delimiter $$ create procedure proc_add_books_looply(in $bookNamevarchar(200),in $pricefloat,in $insertTimesINT) begin while $insertTimes>0 do insert into book (bookName,price) values($bookName,$price); end while; end$$ delimiter ;

可以看到while後面跟條件,條件後面要跟一個do,在while迴圈體結束之後需要end while並以分號結束。

在附上oracle 版的儲存過程:

儲存過程 CREATE OR REPLACE PROCEDURE INERT_test IS i number;  BEGIN   i := 1;        FOR i IN 1..10000 LOOP            insert into             test            (              ID,            NAME,            EMAIL,            TIME            )             values            ('6','你妹','[email protected]',to_date('2012-01-06','yyyy-MM-dd'));        END LOOP;  END; exec INERT_test

相關推薦

mysql 儲存過程1064問題事例

今天晚上室友說我看看你寫的那個框架,聽說查詢十萬條資料只需要幾秒鐘,我當然願意展示,開始準備環境: 在公司我是用的oracle,我就把寫的儲存過程拿出來在我本地的mysql中執行,結果一執行報錯: You have an error in your SQL syntax;

MySQL儲存過程函式的區別與優缺點

為什麼要使用儲存過程和函式 資料庫物件儲存過程和函式,是用來實現一組關於表操作的SQL語句程式碼當做一個整體來執行。一個完整的操作會包含多條SQL語句,在執行過程中需要根據前面的SQL語句來執行結果有選擇的執行後面的SQL語句。 儲存過程和函式可以簡單的理解為一條或多條SQL語句的集合

MySql儲存過程中傳參不傳參以及java中呼叫程式碼

資料庫表結構 1.mysql不傳參寫儲存過程 create procedure product() -- product為儲存過程名稱 begin select * from book; end 呼叫此儲存過程為 CALL product

MySQL--儲存過程的迴圈語句程式碼筆記--while、repeatloop

mysql> delimiter $$ mysql> create table testB -> ( -> id int(6) not null -> ) $$ Query OK, 0 rows affected (0.86 sec) mysq

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

mysql儲存過程函式(一)

  儲存過程和函式是事先經過編譯並存儲在資料庫的一段sql語句集合,呼叫儲存過程和函式可以簡化應用程式開發人員的很多工作,減少資料在資料庫和應用伺服器之間的傳輸,對提高資料執行效率是有好處的。   儲存過程和函式的區別在於函式必須有返回值,而儲存過程卻沒有,儲存過程的引數可以使用IN,OUT,INOUT型別

mysql 儲存過程函式中游標的使用

在儲存過程和函式中,可以使用游標對結果集進行迴圈的處理。 游標的使用包括游標的生命、OPEN、fetch、和close,其語法如下: 1、宣告游標:  declare 游標名 cursor for select_statement(查詢語句) 2、open游標: &nb

mysql儲存過程以及日誌資料恢復

MySQL儲存過程 Mysql儲存過程是一組為了完成特定功能的SQL語句集,經過編譯之後儲存在資料庫中, 當需要使用該組SQL語句時使用者只需要通過指定儲存過程的名字並給定引數就可以呼叫執行它了 簡而言之就是一組已經寫好的命令,需要使用的時候拿出來用就可以了。 \d //(修改語句結

MYSQL儲存過程遊標(2)

儲存過程和遊標! 之前修改了表結構,現在要填充內容了, 需求:將已有的資料表內容進行擴充,比如A表現在增加了欄位,內容在B表,將他轉移過來 這裡經過掙扎,最後達成! /*填充batch_course_p

mysql儲存過程計劃任務【叢集下,計劃任務的執行控制】

DROP PROCEDURE IF EXISTS `p_test_cluster`; DELIMITER ;; CREATE  PROCEDURE `p_test_cluster`() BEGIN     DECLARE iState INTEGER DEFAULT 0;

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

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

MySQL 儲存過程函式

概述   一提到儲存過程可能就會引出另一個話題就是儲存過程的優缺點,這裡也不做討論。因為mysql中儲存過程和函式的語法非常接近所以就放在一起,主要區別就是函式必須有返回值(return),並且函式的引數只有IN型別而儲存過程有IN、OUT、INOUT這三種類型。  1.建立儲存過程和函式語法

MySQL儲存過程中declareset定義變數的區別

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

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

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

mysql 儲存過程 (procedure)常用函式(function)

一, 基本知識 1, 定義 一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。 2,demo DELIMITER // DROP PROCEDURE

MySQL——儲存過程函式使用總結

什麼是儲存過程和函式 儲存過程和函式是事先經過編譯並存儲在資料庫中的一段SQL語句的集合,呼叫儲存過程和函式可以簡化應用開發人員的很多工作,減少資料在資料庫和應用伺服器之間的傳輸,對於提高資料處理的效率是有好處的。 儲存過程和函式的區別在於函式必須有返回值,而儲存過程沒有

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

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

MYSQL儲存過程儲存函式入門

一、MYSQL儲存過程簡介: 儲存過程是一個可程式設計的函式,它在資料庫中建立並儲存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。資料庫中的儲存過程可以看做是對程式設計中面

MySql儲存過程中的基本函式需要用到的運算子

mysql儲存過程學習總結-操作符算術運算子+ 加 SET var1=2+2; 4- 減 SET var2=3-2; 1* 乘 SET var3=3*2; 6/ 除 SET var4=10/3; 3.3333DIV 整除 SET var5=10 DIV 3; 3% 取模 SET var6=10%3 ; 1比較

MySQL儲存過程自定義函式、Navicat for mysql、建立儲存過程函式、呼叫儲存過程函式的區別

與你相遇 好幸運  可我已失去為你淚流滿面的權利  但願在我看不到的天際  你張開了雙翼 1 MySQL儲存過程和函式 過程和函式,它們被編譯後儲存在資料庫中,稱為永續性儲存模組(Persistent Stored Module,PSM),可以反覆呼叫,執行速度快。 1.1 儲存過程 儲存過程是由