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

mysql存儲過程prepare

發布時間: 2023-02-11 21:11:55

① mysql存儲過程支持用表作為參數嗎

mysql存儲過程支持用表作為參數。

這個問題在MySQL 5.0以前非常麻煩,但是在MySQL 5.0.13版之後,由於引入了PREPARE語句,一切變得簡單了。
例子如下(已驗證):

DROPPROCEDUREIFEXISTS`newtable`;
CREATEPROCEDURE`newtable`(INtnamevarchar(64))
BEGIN
SET@sqlcmd=CONCAT('CREATETABLE',tname,'(idintNOTNULLAUTO_INCREMENT,namevarchar(64)DEFAULTNULL,PRIMARYKEY(`id`))');
PREPAREstmtFROM@sqlcmd;
EXECUTEstmt;
DEALLOCATEPREPAREstmt;
END;
callnewtable('abc');

② mysql存儲過程里怎麼循環一張表

給你一個 參考

--存儲過程名和參數,參數中in表示傳入參數,out標示傳出參數,inout表示傳入傳出參數

create procere p_procerecode(in sumdate varchar(10))
begin
declare v_sql varchar(500); --需要執行的SQL語句
declare sym varchar(6);

declare var1 varchar(20);
declare var2 varchar(70);
declare var3 integer;

--定義游標遍歷時,作為判斷是否遍歷完全部記錄的標記
declare no_more_departments integer DEFAULT 0;

--定義游標名字為C_RESULT
DECLARE C_RESULT CURSOR FOR
SELECT barcode,barname,barnum FROM tmp_table;

--聲明當游標遍歷完全部記錄後將標志變數置成某個值
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_departments=1;

set sym=substring(sumdate,1,6); --截取字元串,並將其賦值給一個遍歷

--連接字元串構成完整SQL語句,動態SQL執行後的結果記錄集,在MySQL中無法獲取,因此需要轉變思路將其放置到一個臨時表中(注意代碼中的寫法)。一般寫法如下:

-- 'Create TEMPORARY Table 表名(Select的查詢語句);
set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');

set @v_sql=v_sql; --注意很重要,將連成成的字元串賦值給一個變數(可以之前沒有定義,但要以@開頭)
prepare stmt from @v_sql; --預處理需要執行的動態SQL,其中stmt是一個變數
EXECUTE stmt; --執行SQL語句
deallocate prepare stmt; --釋放掉預處理段

OPEN C_RESULT; --打開之前定義的游標
REPEAT --循環語句的關鍵詞
FETCH C_RESULT INTO VAR1, VAR2, VAR3; --取出每條記錄並賦值給相關變數,注意順序

--執行查詢語句,並將獲得的值付給一個變數 @oldaacode(注意如果以@開頭的變數可以不用通過declare語句事先聲明)
select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate;
if @oldaacode=var1 then --判斷
update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
else
insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
end if;
UNTIL no_more_departments END REPEAT; --循環語句結束
CLOSE C_RESULT; --關閉游標

DROP TEMPORARY TABLE tmp_table; --刪除臨時表
end;

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

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

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

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

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

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

⑥ 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存儲過程

DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `test_ct_201408`()
BEGIN
set @today=DATE_FORMAT(date(now()),'%Y-%m-%d 00:00:00');
set @create_virus_sql=concat("select * from S_ACCOUNT where date_add(registerTime, interval 6 month)<=NOW() INTO OUTFILE "c:\\",@today,".txt" fields terminated by ','; ");

PREPARE create_virus FROM @create_virus_sql;
EXECUTE create_virus;
commit;
END
//
DELIMITER ;

⑧ PHP 使用 Mysqli 的 prepare 語句有什麼好處

好處:
(1)解析查詢只有一次
(2)執行一些查詢優化步驟只有一次
(3)通過二進制協議發送參數比送他們為ASCII文本更有效
比如DATE,對於准備之後,發送日期只用3個位元組;如果沒有準備,日期必須以字元串的形式發送,需要資料庫方再解析,這樣需要發送10個位元組。
(4)只有參數(不是整個查詢文本)需要為每個執行要發送
(5)的MySQL直接存儲parameteres到伺服器上的緩沖區
(6)安全性也有幫助,就沒有必要逃避或引用值。

壞處:
(1)本地到一個連接,以便另一個連接不能再使用
(2)不能使用MySQL查詢緩存(5.1版本之前)
(3)不總是更有效,如果你使用它只有一次
(4)存儲函數中不能使用(存儲過程是可以的)
(5)有可能會導致「泄漏」如果你忘記釋放它

⑨ 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存儲過程一個參數有多個逗號分割

這個應該可以使用字元串拼接,你是不是這樣寫存儲過程:
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)", 然後執行,就可以刪除了。

熱點內容
為什麼說安卓是物聯網的動力 發布:2025-07-14 06:13:51 瀏覽:728
海康dns伺服器什麼意思 發布:2025-07-14 06:13:16 瀏覽:808
linux下的游戲 發布:2025-07-14 05:52:16 瀏覽:748
基帶被加密 發布:2025-07-14 05:52:14 瀏覽:289
小型密碼鎖怎麼改密碼 發布:2025-07-14 05:49:45 瀏覽:622
vs多核編譯 發布:2025-07-14 05:36:43 瀏覽:123
蘋果哪裡有轉移到安卓數據的代碼 發布:2025-07-14 05:34:41 瀏覽:223
虛擬伺服器外網訪問 發布:2025-07-14 05:29:06 瀏覽:1002
如何連接公司伺服器ip 發布:2025-07-14 05:24:02 瀏覽:247
新速騰哪個配置最香 發布:2025-07-14 05:13:38 瀏覽:416