关于mysql prepare语法的

henry_oulen 2017-09-03 04:56:29
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a |
+----+
| 4 |
| 8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;





这是简单的一个mysql prepare语法的测试语句,我有个疑问就是
以下SQL语句可用作预备语句:


ALTER TABLE
ALTER USER
ANALYZE TABLE
CACHE INDEX
CALL
CHANGE MASTER
CHECKSUM {TABLE | TABLES}
COMMIT
{CREATE | DROP} INDEX
{CREATE | RENAME | DROP} DATABASE
{CREATE | DROP} TABLE
{CREATE | RENAME | DROP} USER
{CREATE | DROP} VIEW
DELETE
DO
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES
| LOGS | STATUS | MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES}
GRANT
INSERT
INSTALL PLUGIN
KILL
LOAD INDEX INTO CACHE
OPTIMIZE TABLE
RENAME TABLE
REPAIR TABLE
REPLACE
RESET {MASTER | SLAVE | QUERY CACHE}
REVOKE
SELECT
SET
SHOW {WARNINGS | ERRORS}
SHOW BINLOG EVENTS
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}
SHOW {MASTER | BINARY} LOGS
SHOW {MASTER | SLAVE} STATUS
SLAVE {START | STOP}
TRUNCATE TABLE
UNINSTALL PLUGIN
UPDATE


这些语句是要在在哪个语句中
是在PREPARE 语句中吗
...全文
391 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxywolf888 2020-03-13
  • 打赏
  • 举报
回复
创建一个存储过程,输入两个表的名称$tablename1、$tablename2和一个整数$n,将第一个表中的前$n行记录复制到第二个表中,并将实际复制的行数通过一个变量进行返回。假设这个表不存在,则返回行数为-1。
drop procedure if exists sp8;
delimiter $$
create procedure sp8(
$tablename1 varchar(255),
$tablename2 varchar(255),
$n int,
OUT $rowcount int
)
begin
/* 在mysql系统表中去判断源数据表是否存在,如果存在则返回-1。*/
if not exists(select * from INFORMATION_SCHEMA.TABLES where
TABLE_SCHEMA='mySales' and TABLE_NAME=$tablename1) then
set $rowcount=-1;
else
/* 检索表中的总行数。在预处理语句中不能使用?作为表名的参数。*/
set @sql=concat('SELECT count(*) into @total FROM ', $tablename1);
prepare stmt FROM @sql;
execute stmt;
if ($n>@total) then set $n=@total; end if; #确定实际可以复制的行数
/* 删除表2。*/
set @sql=concat('drop table if exists ', $tablename2);
prepare stmt FROM @sql;
execute stmt;
/* 批量复制表1数据到表2。*/
set @sql=concat('create table ', $tablename2,' select * from ', $tablename1,' limit ', $n);
#SELECT @sql;
prepare stmt FROM @sql;
execute stmt;
deallocate prepare stmt;
set $rowcount=$n;
end if;
end$$
delimiter ;
LongRui888 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_37311616 的回复:
找不到实例,没有思路解决这个问题
你上面贴的语法是说,这些语句是可以作为prepare语句的。
henry_oulen 2017-09-12
  • 打赏
  • 举报
回复
找不到实例,没有思路解决这个问题
繁花尽流年 2017-09-05
  • 打赏
  • 举报
回复
印象中只要是单语句都是可以PREPARE的。LZ这些大概是指这些语句都可以被PREPARE引用

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧