mysql存储过程执行动态sql的问题

问题描述

我现在想通过mysql的存储过程执行动态SQL,传递一个表名查询,根据表名查询表中的第一个列。根据第一列获取其列中的最大值,下面是我写的存储过程。但始终获取不到最大值的结果,请帮忙看一下 是什么原因?DELIMITER $$CREATE PROCEDURE genBillsNoProc(IN tableName VARCHAR(30),OUT data_t VARCHAR(100))BEGINDECLARE sql_1 VARCHAR(1000);DECLARE sql_2 VARCHAR(1000);SET sql_1 = CONCAT("SELECT COLUMN_NAME into @colName FROM information_schema.COLUMNS WHERE table_name='",tableName,"' limit 0,1");SET sql_2 = CONCAT("SELECT MAX(?) FROM ",tableName);SET @frist_sql=sql_1;PREPARE stmt FROM @frist_sql;EXECUTE stmt;SET data_t := @colName;SET @second_sql=sql_2;PREPARE stmt1 FROM @second_sql;EXECUTE stmt1 USING @colName; SELECT sql_2 ;END$$##执行存储过程CALL genBillsNoProc('t_common_system',@data_t);运行存储过程返回结果就是一个列名:col_xxx 问题补充:呵呵,问题解决了正确的SQL:DELIMITER $$ CREATE PROCEDURE genBillsNoProc(IN tableName VARCHAR(30),OUT data_t VARCHAR(100)) BEGIN DECLARE sql_1 VARCHAR(1000); DECLARE sql_2 VARCHAR(1000); SET sql_1 = CONCAT("SELECT COLUMN_NAME into @colName FROM information_schema.COLUMNS WHERE table_name='",tableName,"' limit 0,1");#执行sql_1SQL语句;SET @frist_sql=sql_1; PREPARE stmt FROM @frist_sql; EXECUTE stmt; SET sql_2 = CONCAT("select max(",@colName,") into @sql_result from ",tableName);#执行sql_2SQL语句;SET @second_sql=sql_2; PREPARE stmt1 FROM @second_sql; EXECUTE stmt1; #设置返回结果;SET data_t := @sql_result; END$$ ##执行存储过程 CALL genBillsNoProc('t_common_system',@data_t); SELECT @data_t;

解决方案

SET data_t := @colName; 你对sql_2进行select之后将结果加入到你的out data_t中了吗?没有吧,那怎么会返回最大值呢?
解决方案二:
是不是数据库没练好

时间: 2024-07-28 17:20:50

mysql存储过程执行动态sql的问题的相关文章

MySQL存储过程里动态SQL的使用

MySQL的存储过程不好用,一般在应用开发过程中不建议使用.但有时候在数 据迁移等环境中,特别涉及到复杂点的逻辑处理,就需要存储过程的配合了,当 然,用其他语言写程序实现也是可以的,不过效率估计没有直接在数据库中操作 高. 有时候数据所在的表是不确定的,需要根据实际情况临时决定表名, 这时候就是动态SQL的用武之地了,以下示例展示了在一次数据导出的过程中使用 动态SQL的存储过程例子: delimiter // CREATE PROCEDURE `proc_rt_imp_group`() BEG

mysql存储过程 在动态SQL内获取返回值的方法详解_Mysql

MySql通用分页存储过程过程参数 复制代码 代码如下: p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int  $:begin    declare v_sqlcounts varchar(4000);    declare v_

在存储过程中执行动态sql语句,能否提高性能

问题描述 原本在后台写的sql语句很复杂,属于多表连接操作,现在把它放在了存储过程里用动态sqlexec执行,能否提高性能呢 解决方案 解决方案二:1.可以减轻程序负担,把这些工作都交给DBMS2.程序维护起来更加简单3.仅是个人观点解决方案三:存储过程执行动态sql语句时结尾exec(@sql)和execsp_executesql@sql有何区别解决方案四:差不多的,要提高用存储过程好了解决方案五:但是参数是要动态的,必须用动态SQL

MySQL存储过程中实现执行动态SQL语句的方法_Mysql

本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法.分享给大家供大家参考.具体实现方法如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE set_col_value -> (in_table VARCHAR(128), -> in_column VARCHAR(128), -> in_new_value VARCHAR(1000), -> in_where VARCHAR(4

Java下拼接执行动态SQL语句(转)

       在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题:         http://bbs.csdn.net/topics/390876591         http://bbs.csdn.net/topics/390981627         https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_i

SQL Server执行动态SQL正确方式

SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL Server执行动态SQL有更深的了解. 动态SQL:code that is executed dynamically.它一般是根据用户输入或外部条件动态组合的SQL语句块.动态SQL能灵活的发挥SQL强大的功能.方便的解决一些其它方法难以解决的问题.相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,

使用Oracle的DBMS_SQL包执行动态SQL语句

引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle的DBMS_SQL包可以用来执行动态SQL语句.本文通过一个简单的例子来展示如何利用DBMS_SQL包执行动态SQL语句:   DECLARE        v_cursor NUMBER;        v_stat NUMBER;        v_row NUMBER;        v_id

分享一下SQL Server执行动态SQL的正确方式

SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL Server执行动态SQL有更深的了解 动态SQL:code that is executed dynamically.它一般是根据用户输入或外部条件动态组合的SQL语句块.动态SQL能灵活的发挥SQL强大的功能.方便的解决一些其它方法难以解决的问题.相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,而

mysql存储过程中动态表名的使用

问题描述 mysql存储过程中动态表名的使用 BEGIN if tablename is not null then declare v_sql varchar(500); set v_sql = concat('select WXPayBillID,WXPayMoney FROM ',tablename); select v_sql; set @v_sql=v_sql;///这里写的有问题? prepare stmt from @v_sql; EXECUTE stmt; deallocate