在MYSQL 中使用存储过程调用Alert Table 命令,使用动态SQL 解决

在MYSQL 中使用存储过程调用Alert Table

在MYSQL 中使用存储过程的时候调用 Alter Table命令修改表中列的数据类型是,系统给报了一个错误,xxx.变量名 表不存在,原来是系统吧变量名当做字符串进行解析了。查询资料发现 ,在MySQL的存储过程中不允许调用ALTER TABLE 变量名,变量名只能被当成字符串处理。如果要在存储过程中对表进行修改,可以使用Dynamic SQL,可以构造一个动态的SQL语句,然后使用MySQL的PREPARE语句对其进行预处理,最后再使用EXECUTE语句执行这条动态SQL。

  1. 关键代码如下:
	 SET @query = CONCAT('ALTER TABLE ', tableName, ' MODIFY ', columnName,'  TIMESTAMP DEFAULT CURRENT_TIMESTAMP', ';');
     PREPARE stmt FROM @query;
	 EXECUTE stmt;
	 DEALLOCATE PREPARE stmt;
  1. 完整代码如下:
-- 定义一个有参数的存储过,并传入一个参数表名,修改其中数据类型为datatime的
DROP PROCEDURE  IF EXISTS UpdateType;
CREATE PROCEDURE  UpdateType(IN tableName VARCHAR(300))
BEGIN
 -- 定义变量
  DECLARE columnName VARCHAR(300);
	DECLARE columnType VARCHAR(300);
  DECLARE done INT DEFAULT(0);
	
	-- 创建游标,并存储数据
  DECLARE cur_test CURSOR FOR 
      SELECT column_name, column_type FROM information_schema.columns WHERE table_name = tableName;
  -- 游标中的内容执行完后将 done 设置为 1 
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
  -- 打开游标
  OPEN cur_test;
  -- 执行循环
  posLoop:LOOP
  -- 判断是否结束循环
        IF done=1 THEN
        LEAVE posLoop;
        END IF;
  -- 取游标中的值
  FETCH cur_test INTO columnName,columnType;
	
	     IF columnType='DATETIME' THEN 
 			 -- 修改对应表的数据类型
			 SET @query = CONCAT('ALTER TABLE ', tableName, ' MODIFY ', columnName,'  TIMESTAMP DEFAULT CURRENT_TIMESTAMP', ';');
       PREPARE stmt FROM @query;
			 EXECUTE stmt;
			 DEALLOCATE PREPARE stmt;
			 END IF;
  END LOOP posLoop;
  -- 释放游标 
  CLOSE cur_test; 
END

 -- 定义一个无参数的存储过程并遍历数据库中所有的表
DROP PROCEDURE IF EXISTS UpdateDataType;
CREATE PROCEDURE UpdateDataType()
BEGIN
  -- 定义变量
  DECLARE tableName VARCHAR(300);
  DECLARE done INT DEFAULT(0);
  -- 创建游标,并存储数据
  DECLARE cur_test CURSOR FOR 
      SELECT table_name FROM information_schema.tables WHERE table_schema='demo';
  -- 游标中的内容执行完后将 done 设置为 1 
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
  -- 打开游标
  OPEN cur_test;
  -- 执行循环
  posLoop:LOOP
  -- 判断是否结束循环
        IF done=1 THEN
        LEAVE posLoop;
        END IF;
  -- 取游标中的值
  FETCH cur_test INTO tableName;
	    --  调用UpdateType 去修改对应表的数据类型
			CALL UpdateType(tableName);
  END LOOP posLoop;
  -- 释放游标 
  CLOSE cur_test; 
END 
 
 
 
 
CALL UpdateDataType












### 如何在帆软报表中通过 JavaScript 调用 MySQL 存储过程 在帆软报表 (FineReport) 中,可以通过 JavaScript 编写自定义逻辑来实现对数据库存储过程调用。以下是具体方法以及完整的代码示例。 #### 1. 数据库连接与存储过程准备 确保已创建好 MySQL存储过程并测试其可用性。假设有一个名为 `sp_get_data` 的存储过程,它接受两个输入参数 (`in_param1`, `in_param2`) 并返回查询结果集。 ```sql DELIMITER $$ CREATE PROCEDURE sp_get_data(IN in_param1 INT, IN in_param2 VARCHAR(50)) BEGIN SELECT * FROM your_table WHERE column1 = in_param1 AND column2 = in_param2; END$$ DELIMITER ; ``` 此部分需提前完成,并确认存储过程能够正常运行[^1]。 --- #### 2. 帆软报表中的 JS 实现 在 FineReport 设计器中,可以利用内置的 `_g()` 方法或其他 API 来执行 SQL 或者调用存储过程。以下是一个典型的例子: ##### 步骤描述 - **绑定按钮事件**:选中报表界面上的一个按钮组件,在属性面板中为其添加点击事件。 - **编写 JS 代码**:在弹出的脚本编辑窗口中填写相应的 JavaScript 代码。 ##### 示例代码 ```javascript // 获取当前单元格对象 var cellObj = _g(); // 定义要传递给存储过程的参数 var param1Value = FR.getParameter("param1"); // 使用全局变量获取外部传入的参数值 var param2Value = FR.getParameter("param2"); if (!param1Value || !param2Value) { alert("请输入必要的参数!"); } else { try { // 执行存储过程 var sqlText = "CALL sp_get_data (?, ?)"; var resultDataSet = FR.getDataSetBySQL(sqlText, [param1Value, param2Value]); // 将结果填充到指定区域 cellObj.write(resultDataSet); // 提示成功消息 alert("存储过程调用成功!"); } catch (e) { alert("发生错误:" + e.message); } } ``` 上述代码实现了以下几个功能: - 动态读取用户输入或者预设好的参数; - 构造带有占位符 (?) 的 SQL 文字串用于调用存储过程; - 利用 `FR.getDataSetBySQL` 函数执行动态 SQL 查询并将结果保存至临时数据集中; - 最终把结果显示于目标位置。 --- #### 3. Web 应用集成配置 为了使前端页面能顺利加载和渲染由后端生成的内容,还需要适当调整 Servlet 映射规则。例如修改 web.xml 文件如下所示: ```xml <!-- 集成帆软报表 --> <servlet> <servlet-name>ReportServer</servlet-name> <servlet-class>com.fr.web.ReportServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ReportServer</servlet-name> <url-pattern>/ReportServer/*</url-pattern> </servlet-mapping> ``` 这样做的目的是让浏览器请求路径 `/ReportServer/...` 可被正确转发至对应的处理程序实例化服务[^2]。 --- #### 4. 参数设置注意事项 如果涉及复杂的多级联筛选条件,则可能需要用到额外的功能模块支持。比如针对 Oracle JNDI 连接池场景下的特殊适配需求,请参照官方文档进一步学习关于不同环境部署指南的信息[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值