mysql存储过程中调用Prepare返回值

事实上,MySQL不支持动态sql返回结果。
不能使用PrepareStatement声明游标。
游标只能使用嵌入式SQL来声明。
所以如果想要实现这个功能,还需要考虑其他的方法。
给您的一个建议是创建一个临时表(CreatetemporaryTableName),将查询结果存储在这个临时表中,然后您可以对该临时表进行操作。
但也非常复杂!!!~

为什么要用个临时表先存数据?

我们仍然使用实验05中的环境,并省略数据准备过程。

我们仍然使用两个会话,一个会话run用于运行主SQL,另一个会话PS用于观察performance_schema:

Main会话线程数为29,

Performance_sch更改ema中的统计信息被重置。

临时表的表大小限制取决于tmp_table_size参数中较小的一个和最大堆表大小。
我们的实验以max_heap_table_size设置为例。

我们将会话级临时表大小设置为2MB(小于上次实验中临时表使用的空间),并使用临时表执行SQL:

查看内存分配数据集:

你会发现内存分配略大于2MB。
我们假设临时表的消耗会比配置稍多一些,可以忽略。

查看该语句的特征值:

可以看到该语句使用了需要写入磁盘的临时表。

这个临时表占用了多少空间?

我们在Performance_schema中启用与等待相关的统计元素:

重复实验并跳过它。

查看performance_schema的统计值:

可以观察到几个现象:

1临时表空间为7.92MiB数据。

2.该数据在写入指令后缓慢且增量地写入。

我们来看看这些写操作有什么特点?我们在实验03中使用了这个方法:

可以看到写线程是page_clean_thread,这是一个脏操作。
这样你就可以理解为什么数据写入速度慢了。

还可以看到每个I/O操作的大小为16KB。
这是刷新数据页的操作。

结论:

我们可以看到

1.MySQL在内存可用的情况下设置max_heap_table_size基本是一样的,不是够了,直接将表传输到磁盘存储。

2.由于引擎不同(内存表引擎为Heap,磁盘表引擎遵循internal_tmp_disk_storage_engine的配置),本实验写入磁盘的数据量与实验05内存中使用的数据量不同。

3.如果临时表使用了磁盘,并且表引擎配置为InnoDB,脏页会被后续flush,即使临时表是在短期SQL中使用并在使用后被释放。
磁盘上消耗了一些I/O。