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

mysqlprepare存儲過程

發布時間: 2023-03-26 23:46:16

㈠ mysql存儲過程求大神(拼接字元串)

DROPPROCEDUREIFEXISTS`p_create_view`

CREATEPROCEDUREp_create_view()
BEGIN
DECLAREtableNameVARCHAR(100);
DECLAREstopFlagINT;
DECLAREsql1VARCHAR(1000);
DECLAREcursor_nameCURSORFORSELECTTABLE_NAMEFROMinformation_schema.tablesWHERETABLE_NAMELIKE'test_2014%';
'02000'SETstopFlag=1;
SET@sql1='createviewtestasselectid,namefrom';
OPENcursor_name;
REPEAT
FETCHcursor_nameINTOtableName;
SELECTCONCAT(@sql1,tableName,'UNIONALLSELECTid,nameFROM')INTO@sql1FROMDUAL;
UNTILstopFlagENDREPEAT;
CLOSEcursor_name;
SELECTSUBSTR(@sql1,1,LENGTH(@sql1)-31)INTO@sql1FROMDUAL;
PREPAREstepFROM@sql1;
EXECUTEstep;
END;

㈡ mysql存儲過程

存儲過程在mysql中是新面孔,最近一直在用存儲過程,但忘記了一個很重要的問題,如何得到存儲過程的列表。
可能是對mysql太有信心了,一開始我沒考慮過這個問題,直到我建立了55個存儲過程後,才意識到問題的嚴重性,我無法用類似show tables獲得表的列表一樣用show PROCEDURES 來獲得存儲過程的列表。我試了show stored routines 、show storedroutines 、show routines等等,結果都在意料之中,得不到。
接著我想到了information_schema庫,在以前,select * from information_schema.tables;是比show tables還要方便得到表信息的辦法,於是我去了information_schema庫中轉了一圈,仍然一無所獲。而完全沒有去想一直用來保存用戶和地址信息的mysql庫。
就在今天為了建立可以調用存儲過程的用戶時,我訪問了mysql庫,在剛進的時候察覺了庫中多了幾個表,也沒在意,在要離開的時候才注意到裡面有一個表的名字叫proc,似乎是建立存儲過程時使用的PROCEDURES前4位字母,於是select了一下,結果掘到了寶。存儲過程的相關數據好好的保存在裡面。看來以後也同樣不能小看mysql庫了。
想要得到你的存儲過程列表,那麼執行下面的語句吧。

select name,db from mysql.proc;

ps:還得知了存儲過程的名稱長度為64個位元組,多於64則自動刪除。可以使用中文-_-!!!

㈢ mysql存儲過程中調用Prepare返回值

事實上MySQL還不支持從動態sql中返回結果,既不能用PrepareStatement來聲明游標,游標只能用嵌入式SQL來聲明。
所以你要實現這個功能就要考慮其它的辦法,給你一個建議就是創建一個臨時表(Create temporary TableName),將你查詢出的結果存放的這個臨時表裡,然後你可以對這張臨時表進行操作。但是也很復雜的!!!~

㈣ mysql存儲過程中執行prepare出錯

如果在
存儲過程
調用的時候顯式的調用了事務處理,那麼,會
回滾
,否則執行到那裡就在哪裡生效。

㈤ mysql存儲過程一個參數有多個逗號分割

這個應該可以使用字元串拼接,你是不是這樣寫存儲過程:
create procere p_proc(var_in int)
begin
delete from [tableName] where [colName] in (var_in);

end

然後又這樣調用:
call p_proc(1, 2, 3);
這樣肯定不行,那麼你可以這樣:
create procere p_proc(var_in varchar(5000))
begin

set @sql = concat("delete from [tableName] where [colName] in (", var_in, ")");

prepare stmt_exe_sql from @sql;
execute stmt_exe_sql;
deallocate prepare stmt_exe_sql;
end

這樣就相當於把(1, 2, 3)拼接成語句"delete from [tableName] where [colName] in (1, 2, 3)", 然後執行,就可以刪除了。

㈥ Mysql 存儲過程的問題

給一個簡單的例子給你
DROP PROCEDURE IF EXISTS insertStudents;
CREATE PROCEDURE insertStudents(IN P_SNAME VARCHAR(20))
BEGIN
DECLARE V_STUID INT DEFAULT 0;
SET @V_BIRTHDAY ='';
SET @NAME=P_SNAME;
SET @V_BIRTHDAY=date_format(NOW(), '%Y%m%d%H%i%s');
SELECT MAX(STUID) INTO V_STUID FROM Students;
if V_STUID is null then
set V_STUID=1;
else
SET V_STUID=V_STUID+1;
end if;
SET @ID=cast(V_STUID AS CHAR);-- 將數字轉化為字元
-- SET @ID=CONCAT(V_STUID,''); -- 將數字轉化為字元
SET @INSERTSQL=CONCAT('INSERT INTO Students(STUID,SNAME,BIRTHDAY) VALUES(?,?,?)');
start transaction;
PREPARE stmtinsert FROM @INSERTSQL;
EXECUTE stmtinsert USING @ID,@NAME,@V_BIRTHDAY;

savepoint tran_a;
SET V_STUID=V_STUID+1;
SET @ID=cast(V_STUID AS CHAR);-- 將數字轉化為字元
EXECUTE stmtinsert USING @ID,@NAME,@V_BIRTHDAY;
DEALLOCATE PREPARE stmtinsert;
rollback to tran_a;
commit;
END;

㈦ mysql 存儲過程 資料庫表名欄位作為參數傳遞給存儲過程的方法

直接將資料庫表名欄位作為字元類型傳到存儲過程中,存儲過程拼接sql語句,再用exec執行。例如:
CREATE PROCEDURE [proc_test]
(@tablename varchar(100))
WITH
EXECUTE AS CALLER
AS
declare @sql varchar(1000);
set @sql='select * from '+@tablename
exec(@sql)
GO

再直接執行 exec proc_test '學生表'

㈧ 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以前並不支持存儲過程

㈨ 怎麼用mysql的存儲過程創建表, 不要用這種方法:PREPARE DD FROM @sqlstr; EXECUTE DD; 能不能直接運行@s

如果你的表明是固定的 那麼可以用CREATE TABLE直接創建,如果表明是動態的,那隻有用PREPARE 了, 沒辦法

㈩ 五、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掉了

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:330
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:371
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:606
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:27
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:100
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:935
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:728
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:798
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:505
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:367