通过存储过程更新表结构
2016-06-03 15:58
573 查看
/* oracle版本修改表结构
* sp_alter_table:修改表结构
* t_name:表名称
* f_name:列名称
* ftype:数据类型
*================================================================*/
procedure sp_alter_table(t_name in varchar2,f_name in varchar2,ftype varchar2) is
--定义变量
v_strSQL varchar2(2000);
v_col int;
begin
select count(*)
into v_col
from user_tab_columns a
where a.table_name = '' || upper(t_name) || ''
and a.column_name = '' || upper(f_name) || '';
if v_col = 0 then
v_strSQL := 'alter table '||t_name||' add '||f_name||' '||ftype||'';
dbms_output.put_line(v_strSQL);
execute immediate v_strSQL;
end if;
end;
/* Mysql版本修改表结构
* Alter_Table_Object:修改表结构
* sqlStr:alter 语句
* columnName:字段名称
* tableName:表名称
*================================================================*/
DROP PROCEDURE IF EXISTS `Alter_Table_Object`;
CREATE DEFINER=`root`@`%` PROCEDURE `Alter_Table_Object`(IN sqlStr VARCHAR(1000), IN columnName VARCHAR(100), IN tableName VARCHAR(100))
BEGIN
IF NOT EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = tableName
AND COLUMN_NAME = columnName)
THEN
SET @v_sql=sqlStr;
PREPARE stmt FROM @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;
下面是mysql版本具体测试
use privatelypolicy;
- 18902 添加更新forceaccesspolicy表结构
CALL Alter_Table_Object('ALTER TABLE `forceaccesspolicy` ADD COLUMN `policycategory` SMALLINT(6) DEFAULT 1 AFTER `policystatus`','policycategory','forceaccesspolicy');
-- 19425 添加更新policyheap表结构
CALL Alter_Table_Object('ALTER TABLE `policyheap` ADD COLUMN `ispush`TINYINT(1) DEFAULT 0','ispush','policyheap');
-- 新增plat_policy_issue_record表
-- ----------------------------
-- Table structure for `plat_policy_issue_record`
-- ----------------------------
CREATE TABLE IF NOT EXISTS `plat_policy_issue_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`batch` int(11) NOT NULL,
`platId` varchar(40) NOT NULL,
`policyMark` varchar(32) NOT NULL,
`serviceType` varchar(32) NOT NULL,
`time` varchar(32) NOT NULL,
`lockTime` int(11) DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL,
`isAnswer` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8;
* sp_alter_table:修改表结构
* t_name:表名称
* f_name:列名称
* ftype:数据类型
*================================================================*/
procedure sp_alter_table(t_name in varchar2,f_name in varchar2,ftype varchar2) is
--定义变量
v_strSQL varchar2(2000);
v_col int;
begin
select count(*)
into v_col
from user_tab_columns a
where a.table_name = '' || upper(t_name) || ''
and a.column_name = '' || upper(f_name) || '';
if v_col = 0 then
v_strSQL := 'alter table '||t_name||' add '||f_name||' '||ftype||'';
dbms_output.put_line(v_strSQL);
execute immediate v_strSQL;
end if;
end;
/* Mysql版本修改表结构
* Alter_Table_Object:修改表结构
* sqlStr:alter 语句
* columnName:字段名称
* tableName:表名称
*================================================================*/
DROP PROCEDURE IF EXISTS `Alter_Table_Object`;
CREATE DEFINER=`root`@`%` PROCEDURE `Alter_Table_Object`(IN sqlStr VARCHAR(1000), IN columnName VARCHAR(100), IN tableName VARCHAR(100))
BEGIN
IF NOT EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = tableName
AND COLUMN_NAME = columnName)
THEN
SET @v_sql=sqlStr;
PREPARE stmt FROM @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;
下面是mysql版本具体测试
use privatelypolicy;
- 18902 添加更新forceaccesspolicy表结构
CALL Alter_Table_Object('ALTER TABLE `forceaccesspolicy` ADD COLUMN `policycategory` SMALLINT(6) DEFAULT 1 AFTER `policystatus`','policycategory','forceaccesspolicy');
-- 19425 添加更新policyheap表结构
CALL Alter_Table_Object('ALTER TABLE `policyheap` ADD COLUMN `ispush`TINYINT(1) DEFAULT 0','ispush','policyheap');
-- 新增plat_policy_issue_record表
-- ----------------------------
-- Table structure for `plat_policy_issue_record`
-- ----------------------------
CREATE TABLE IF NOT EXISTS `plat_policy_issue_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`batch` int(11) NOT NULL,
`platId` varchar(40) NOT NULL,
`policyMark` varchar(32) NOT NULL,
`serviceType` varchar(32) NOT NULL,
`time` varchar(32) NOT NULL,
`lockTime` int(11) DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL,
`isAnswer` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8;
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- MySQL 备份和恢复策略
- 表空间操作
- PreparedStatement中in子句的处理
- mac下安装mysql(转载)