當前位置:首頁 » 存儲配置 » mysql存儲過程select

mysql存儲過程select

發布時間: 2022-12-25 10:58:30

A. mysql存儲過程的基本用法有哪些

mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。

特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。

一、MySQL 創建存儲過程

"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。
復制代碼 代碼如下:
drop procere if exists pr_add;

計算兩個數之和
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
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 as sum;
/*
return c;
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。

*/
end;

二、調用 MySQL 存儲過程
復制代碼 代碼如下:
call pr_add(10, 20);

執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。
復制代碼 代碼如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);

三、MySQL 存儲過程特點

創建 MySQL 存儲過程的簡單語法為:
復制代碼 代碼如下:
create procere 存儲過程名字()
(
[in|out|inout] 參數 datatype
)
begin
MySQL 語句;
end;

MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。

1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()"

2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。
復制代碼 代碼如下:
create procere pr_add
(
@a int, -- 錯誤
b int -- 正確
)

3. MySQL 存儲過程的參數不能指定默認值。

4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
as -- 錯誤,MySQL 不需要 "as"
begin
mysql statement ...;
end;

5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;

6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";"
復制代碼 代碼如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;

7. MySQL 存儲過程中的注釋。
復制代碼 代碼如下:
/*
這是個
多行 MySQL 注釋。
*/
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格)
if a is null then # 這也是個單行 MySQL 注釋
set a = 0;
end if;

B. mysql存儲過程中,兩層select遍歷list怎麼寫

把id拿到update裡面循環判斷 當與外面一層相等的時候就執行 update

C. mysql 存儲過程中的select into outfile語句生成的文件放哪裡

表數據導出到一個文本文件最簡單的方法是使用SELECT... INTO OUTFILE語句的查詢結果直接導出到一個文件在伺服器主機上。
導出數據的SELECT...INTO OUTFILE聲明:

這句話的語法結合了常規的SELECT INTO OUTFILE文件名的末尾。默認的輸出格式是相同的LOAD DATA,所以下面的語句導出tutorials_tbl的表製表符分隔的,換行結尾的文件到/tmp/tutorials.txt:

mysql> SELECT * FROM tutorials_tbl
-> INTO OUTFILE '/tmp/tutorials.txt';

也可以更改輸出格式,使用選項來指示如何引用和分隔列和記錄。 CRLF終止線要導出tutorial_tbl的CSV格式的表格,使用這樣的語句:

mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY ' ';

SELECT ... INTO OUTFILE具有以下屬性:

  • 由MySQL伺服器直接創建輸出文件,這樣的文件名應指定您希望在伺服器主機上的文件將被寫入。沒有本地版本的LOAD DATA LOCAL版本的類似的語句。

  • 必須要有MySQL的FILE許可權才能執行的SELECT... INTO語句。

  • 輸出文件必須不存在。這可以防止MySQL從會破壞文件可能重要。

  • 應該在伺服器主機上或一些方法來檢索文件從該主機的登錄帳戶。否則SELECT... INTO OUTFILE可能是沒有價值的。

  • 在Unix下,創造了世界可讀的文件和所擁有的MySQL伺服器。這意味著雖然就可以讀取該文件,但是不能夠刪除它。

  • 作為原始數據的導出表:

    使用mysqlmp程序復制或備份表和資料庫。它可以寫表輸出的原始數據文件或為一組的INSERT語句重新創建該表中的記錄。
    轉儲一個表,必須指定一個數據文件 - 選項卡上的選項,表示想要的MySQL伺服器寫入文件所在的目錄。


    使用mysqlmp程序復制或備份表和資料庫。它可以寫表輸出的原始數據文件,或為一組的INSERT語句重新創建該表中的記錄。
    轉儲一個表,必須指定一個數據文件 - 選項卡上的選項,表示想要的MySQL伺服器寫入文件所在的目錄。

  • $ mysqlmp -u root -p --no-create-info

  • --tab=/tmp TUTORIALS tutorials_tbl

  • password ******

  • 在SQL格式導出表的內容或定義:

    一個表中的SQL格式導出到一個文件,使用這樣的命令:

  • $ mysqlmp -u root -p TUTORIALS tutorials_tbl > mp.txt

  • password ******

  • 這將創建文件的內容如下:

  • -- MySQL mp 8.23

  • --

  • -- Host: localhost Database: TUTORIALS

  • ---------------------------------------------------------

  • -- Server version 3.23.58


  • --

  • -- Table structure for table `tutorials_tbl`

  • --


  • CREATE TABLE tutorials_tbl (

  • tutorial_id int(11) NOT NULL auto_increment,

  • tutorial_title varchar(100) NOT NULL default '',

  • tutorial_author varchar(40) NOT NULL default '',

  • submission_date date default NULL,

  • PRIMARY KEY (tutorial_id),

  • UNIQUE KEY AUTHOR_INDEX (tutorial_author)

  • ) TYPE=InnoDB;


  • --

  • -- Dumping data for table `tutorials_tbl`

  • --


  • INSERT INTO tutorials_tbl

  • VALUES (1,'Learn PHP','John Poul','2007-05-24');

  • INSERT INTO tutorials_tbl

  • VALUES (2,'Learn MySQL','Abl S','2007-05-24');

  • INSERT INTO tutorials_tbl

  • VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');

  • 要轉儲多個表,他們的名字所有的資料庫名稱參數。要轉儲整個資料庫,不指定任何錶後的資料庫,如下所示:

  • $ mysqlmp -u root -p TUTORIALS > database_mp.txt

  • password ******

  • 所有可用的資料庫備份主機上使用以下命令:

  • $ mysqlmp -u root -p --all-databases > database_mp.txt

  • password ******

  • 在SQL格式導出表的內容或定義:

    這些方法可用於實現資料庫的備份策略。
    表或資料庫復制到另一台主機:

    如果要復制的表或資料庫從一個MySQL伺服器,然後使用mysqlmp資料庫名和表名。

    在源主機上運行以下命令。這將轉儲完整的資料庫到mp.txt文件:

  • $ mysqlmp -u root -p database_name table_name > mp.txt

  • password *****

  • 復制完整的資料庫,而不使用一個特定的表名稱,如上面所解釋。

    現在,FTP mp.txt文件在另一台主機上,使用下面的命令。在運行此命令之前,請確保已創建目標伺服器上的資料庫名稱。

  • $ mysql -u root -p database_name < mp.txt

  • password *****

  • 另一種方法,而無需使用一個中間文件來完成,mysqlmp輸出直接通過網路發送到遠程的MySQL伺服器。如果可以連接到兩台伺服器的cookbook 資料庫所在的主機上,使用以下命令:

  • $ mysqlmp -u root -p database_name

  • states | mysql -h other-host.com database_name

  • 命令mysqlmp的一半連接到本地伺服器,並寫入轉儲輸出管道。 MySQL的一半的命令連接到遠程MySQL伺服器otherhost.com。它讀取輸入管和其他host.com伺服器發送的每個語句。

D. MYSQL 存儲過程如何取得一個表的查詢結果

假設A表有3個欄位,ID, DATA1,DATA2
簡單的話可以不使用存儲過程,比如:
select * form A where ID in (select ID from A where DATA1 between 0 and 100)

如果你的應用比較復雜,在嵌套中還有復雜的運算,存儲過程可以如下例子:
CREATE PROCEDURE test(in_start int,in_end int)
BEGIN
DECLARE ids TEXT;
select GROUP_CONCAT(ID) into ids from A where DATA1 between in_start and in_end;
select * from A where FIND_IN_SET(ID,ids) > 0;
END
註: in_start, in_end是DATA1的篩選范圍。 後面一個select直接返回一個表

直接用SQL和使用存儲過程各有利弊,存儲過程在你使用大量查詢及SQL運算的時候效率很高,而且存儲過程一旦寫入資料庫會被自動編譯運行速度比較快,而SQL是每次執行都需要被編譯一次的。但是存儲過程的調試比較麻煩,不像你使用編程語言和SQL的時候可以單步調試。而且如果沒有熟練掌握存儲過程的效率優化情況下,使用存儲過程可能比使用SQL更慢。

E. 五、MYSQL存儲過程和函數

• create procere用來創建 存儲過程 ,create function用來創建 函數

Delimiter命令是改變語句的結束符 ,MySQL默認的結束符為;號,由於procere和function中的;號並不代表創建的結束,所以要替換成另外的結束符以便表示創建的結束
• rontine_body子句可以包含一個簡單的SQL語句,也可以包含多個SQL語句, 通過begin…end將這多個SQL語句 包含在一起
• MySQL存儲過程和函數中也可以包含類似create和drop等DDL語句
• comment子句用來寫入對存儲過程和函數的注釋
Language子句用來表示此存儲過程和函數的創建語言
存儲過程和函數被標注為deterministic表明當輸入相同的參數是會返回相同的結果,反之如果是not deterministic則表示相同參數不會是相同結果,默認是not deterministic

相關屬性短語只有咨詢含義,並不是強制性的約束

• Drop procere/function語句用來 刪除指定名稱的存儲過程或函數

• Begin…end語句通常出現在存儲過程、函數和觸發器中,其中 可以包含一個或多個語句 ,每個語句用;號隔開

• 標簽label可以加在begin…end語句以及loop, repeat和while語句
語句中通過iterate和leave來控制流程,iterate表示返回指定標簽位置,leave表示跳出標簽

Declare語句通常用來聲明本地變數、游標、條件或者handler
Declare語句只允許出現在begin … end語句中而且必須出現在第一行
Declare的順序也有要求,通常是先聲明本地變數,再是游標,然後是條件和handler

• 本地變數可以通過declare語句進行聲明
聲明後的變數可以通過select … into var_list進行賦值,或者通過set語句賦值,或者通過定義游標並使用fetch … into var_list賦值
• 通過declare聲明變數方法:

• MySQL支持if,case,iterate,leave,loop,while,repeat語句作為存儲過程和函數中的 流程式控制制語句 ,另外return語句也是函數中的特定流程式控制制語句

• Case語句在存儲過程或函數中表明了 復雜的條件選擇語句

• IF語句在存儲過程或函數中表明了 基礎的條件選擇語句

其中在 function 裡面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個參數。
在 MySQL 中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;

• Iterate語句 僅出現在loop,repeat,while循環語句中,其含義表示重新開始此循環

• Leave語句表明 退出指定標簽的流程式控制制語句塊
• 通常會用在begin…end,以及loop,repeat,while的循環語句中

• Loop語句是存儲過程或函數中表達 循環執行 的一種方式

• repeat語句是存儲過程或函數中表達 循環執行 的一種方式

• while語句是存儲過程或函數中表達 循環執行 的一種方式

• Return語句用在 函數中,用來終結函數的執行並將指定值返回給調用者

• Cursor游標用來 聲明一個數據集
• 游標的聲明必須在變數和條件聲明之後,在handler聲明之前

• Cursor close語句用來 關閉之前打開的游標

• Cursor declare語句用來聲明一個游標和指定游標對應的數據集合, 通常數據集合是一個select語句

• Cursor fetch語句用來獲取游標指定數據集的 下一行數據 並將各個欄位值賦予後面的變數

• Open cursor語句用來打開一個之前已經 聲明好的游標

• Declare condition語句命名 特定的錯誤條件 ,而該特定錯誤可以在declare…handler中指定 處理方法

• 比如在MySQL中1051error code表示的是unknown table的錯誤,如果要對這
個錯誤做特殊處理,可以用三種方法:

• Declare handler語句用來聲明一個handler來處理一個或多個特殊條件,當其中的某個條件滿足時則觸發其中的statement語句執行
• Statement可以是一個簡單SQL語句,也可以是begin…end組成的多個語句

• Handler_action子句聲明當執行完statement語句之後應該怎麼辦

Condition_value的值有以下幾種:

• 當condition發生但沒有聲明handler時,則存儲過程和函數依照如下規則處理

• create trigger語句用來創建一個觸發器,觸發器的作用是當表上有對應SQL語句發生時,則觸發執行
• 觸發器創建時需要 指定對應的表名 tbl_name

Definer關鍵詞用來指定trigger的安全環境
• Trigger_time指定觸發器的執行時間,BEFORE和AFTER指定觸發器在表中的 每行數據修改前或者後 執行
• Trigger_event指定觸發該觸發器的具體 事件
• INSERT當新的一行數據插入表中時觸發,比如通過執行insert,load data,replace語句插入新數據
• UPDATE當表的一行數據被修改時觸發,比如執行update語句時
• DELETE當表的一行數據被刪除時觸發,比如執行delete,replace語句時
• 當執行insert into … on plicate key update語句時,當碰到重復行執行update時,則觸發update下的觸發器
• 從5.7.2版本開始,可以創建具有相同trigger_time和trigger_event的同一個表上的多個觸發器,默認情況下按照創建的時間依次執行,通過 指定FOLLOWS/PRECEDES改變執行順序 ,即FOLLOWS時表示新創建的觸發器後執行,PRECEDES則表示新觸發器先執行
• Trigger_body表示觸發器觸發之後要執行的一個或多個語句,在內部可以引用涉及表的欄位, OLD.col_name表示行數據被修改或刪除之前的欄位數據,NEW.col_name表示行數據被插入或修改之後的欄位數據

• Drop trigger語句用來 刪除一個觸發器

• If exists短語用來避免刪除不存在的觸發器時引發報錯
當你執行drop table時,表上的觸發器也被drop掉了

F. mysql存儲過程

MySQL存儲過程創建的格式如下:
CREATE PROCEDURE 過程名 ([過程參數[,...]])[特性 ...] 過程體
舉例代碼如下:

CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這里有一個輸出參數s,類型是int型,如果有多個參數用","分割開。
過程體的開始與結束使用BEGIN與END進行標識。
注意:MySQL在5.0以前並不支持存儲過程

G. mysql 創建存儲過程中用到循環,怎麼通過select返回結果集

測試表與測試數據
CREATETABLETestMulToOne(
nameVARCHAR(10),
allTitlesVARCHAR(200)
);
INSERTINTOTestMulToOneVALUES('張三','程序員,系統管理員,網路管理員');
INSERTINTOTestMulToOneVALUES('李四','項目經理,系統分析員');
DELIMITER//
DROPFUNCTIONGetTextCount//
/**********
--獲取字元串中有幾個部分.
**********/
CREATEFUNCTIONGetTextCount(pSourceTextVARCHAR(255),pDivCharCHAR(1))
RETURNSTINYINT
BEGIN
--預期結果.
DECLAREvResultTINYINT;
--當前逗號的位置.
DECLAREvIndexINT;
--前一個逗號的位置.
DECLAREvPrevIndexINT;
--結果的初始值.
SETvResult=1;
--查詢第一個逗號的位置.
SETvIndex=INSTR(pSourceText,pDivChar);
IFvIndex=0THEN
--參數中沒有逗號,直接返回.
RETURNvResult;
ENDIF;
--初始化情況,前一個逗號不存在.
SETvPrevIndex=0;
--循環處理。
WHILEvIndex>0DO
--結果遞增.
SETvResult=vResult+1;
--前一個逗號的位置=當前逗號的位置
SETvPrevIndex=vIndex;
--查詢下一個逗號的位置.
SETvIndex=LOCATE(pDivChar,pSourceText,vPrevIndex+1);
ENDWHILE;
--返回結果.
RETURNvResult;
END;
//

DROPFUNCTIONGetTextValue//
/**********
--獲取字元串中具體某一個部分的數據.
**********/
CREATEFUNCTIONGetTextValue(pSourceTextVARCHAR(255),pDivCharCHAR(1),pIndexTINYINT)
RETURNSVARCHAR(255)
BEGIN
--預期結果.
DECLAREvResultVARCHAR(255);
IFpIndex=1THEN
SELECTSUBSTRING_INDEX(pSourceText,pDivChar,1)INTOvResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText,pDivChar,pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText,pDivChar,pIndex-1),pDivChar),
'')INTOvResult;
ENDIF;

--返回.
RETURNvResult;
END;
//

DELIMITER;

/*
SELECTGetTextCount('程序員,系統管理員,網路管理員',',')ASCo;
SELECT
GetTextValue('程序員,系統管理員,網路管理員',',',1)ASA,
GetTextValue('程序員,系統管理員,網路管理員',',',2)ASB,
GetTextValue('程序員,系統管理員,網路管理員',',',3)ASC;
*/SELECT
t.name,
GetTextValue(t.allTitles,',',MaxNum.No)ASOneTitle
FROM
TestMulToOnet,
(SELECT1NoUNIONALL
SELECT2NoUNIONALL
SELECT3NoUNIONALL
SELECT4NoUNIONALL
SELECT5No)MaxNum
WHERE
GetTextCount(t.allTitles,',')>=MaxNum.No
ORDERBY
t.name;

+------+------------+
|name|OneTitle|
+------+------------+
|張三|系統管理員|
|張三|網路管理員|
|張三|程序員|
|李四|系統分析員|
|李四|項目經理|
+------+------------+
5rowsinset(0.00sec)

H. 如何在mysql存儲過程中處理select語句返回的多行結果

如果對select 返回的結果行都需要處理,使用游標。
如果只想取得返回多行中的一行,使用limit。

下面的代碼可以作為參考:

CREATEPROCEDUREcurdemo()
BEGIN
DECLAREdoneINTDEFAULT0;
DECLAREaCHAR(16);
DECLAREb,cINT;
DECLAREcur1CURSORFORSELECTid,dataFROMtest.t1;
.t2;
'02000'SETdone=1;

OPENcur1;
OPENcur2;

REPEAT
FETCHcur1INTOa,b;
FETCHcur2INTOc;
IFNOTdoneTHEN
IFb<cTHEN
INSERTINTOtest.t3VALUES(a,b);
ELSE
INSERTINTOtest.t3VALUES(a,c);
ENDIF;
ENDIF;
UNTILdoneENDREPEAT;

CLOSEcur1;
CLOSEcur2;
END

I. 怎麼在mysql中查詢已建立的存儲過程

1、首先先創建一個存儲過程,代碼如圖,存儲過程主要的功能是為表JingYan插入新的數據。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:600
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:892
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:585
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:769
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:689
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1016
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:261
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:119
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:809
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:718