当前位置:首页 » 存储配置 » 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)", 然后执行,就可以删除了。

热点内容
java输入多行 发布:2025-07-14 13:59:05 浏览:109
asp数据库下载 发布:2025-07-14 13:30:36 浏览:218
shell脚本多判断条件 发布:2025-07-14 13:26:16 浏览:176
微信php开发框架 发布:2025-07-14 13:24:52 浏览:448
美国云服务器租用平台 发布:2025-07-14 12:37:21 浏览:908
android单选列表 发布:2025-07-14 12:20:06 浏览:727
刷红玉脚本 发布:2025-07-14 12:19:32 浏览:247
贪心算法会场安排 发布:2025-07-14 11:52:48 浏览:758
健康教育传播脚本 发布:2025-07-14 11:16:12 浏览:157
诛仙手游炼器有脚本吗 发布:2025-07-14 11:10:05 浏览:501