利用数据库的存储过程批量建表和批量插入数据

1.MySQL批量插入数据

/* 
利用MySQL存储过程批量创建MySQL的表:
test_1
test_2
test_...
*/

-- 如果存储过程已存在,先删除
DROP PROCEDURE IF EXISTS `createTables`;

-- 创建存储过程
-- 先自定义分隔符代付默认的分号分隔符、再创建存储过程,然后复默认分号分隔符,最后查询或执行存储过程
-- 注意:
-- 1.存储过程中包含多行、存在分号与默认的分隔符冲突,因此使用 DELIMITER 定义一个特殊的分隔符,遇到特殊分隔符才算语句的结束,才开始SQL解析和执行
-- 2.如果存储过程中的对象命名存在关键字冲突,则需要特殊符号(反引号)括起来
-- 3.MySQL中不要使用 CREATE OR REPLACE PROCEDURE,必须使用 CREATE PROCEDURE,Oracle中才支持 CREATE OR REPLACE PROCEDURE 语法
DELIMITER $$  -- 自定义分隔符
CREATE PROCEDURE `createTables`()
BEGIN
    DECLARE `@i` int(11);
    DECLARE `@createSql` VARCHAR(2560);
    DECLARE `@createIndexSql1` VARCHAR(2560);
    DECLARE `@createIndexSql2` VARCHAR(2560);
    DECLARE `@createIndexSql3` VARCHAR(2560);
    set `@i`=1;
    WHILE `@i`<=4 DO 
         -- `M_ID` bigint AUTO_INCREMENT PRIMARY KEY NOT NULL,
         -- createTable     
         SET @createSql = CONCAT('CREATE TABLE IF NOT EXISTS test_',`@i`,'(
            `id` INT(11) NOT NULL COMMENT \'用户id\',
            `name` VARCHAR(255) COMMENT \'用户名\',
            `info` VARCHAR(255) COMMENT \'信息\',
            `cnt` INT(11) DEFAULT 0 COMMENT \'计数\',
            PRIMARY KEY (`id`)  
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin');
         prepare stmt from @createSql;
         execute stmt;
         SET `@i`= `@i`+1; 
    END WHILE;
END;
$$  -- 语句结束
DELIMITER ;  -- 重新定义(恢复)默认的分号分隔符


-- 查询存储过程
SHOW CREATE PROCEDURE `createTables`;

-- 调用存储过程创建表
CALL createTables();


 

/* MySQL批量插入数据,举例 */

-- 如果存储过程已存在,先删除
DROP PROCEDURE test;

DELIMITER $$
CREATE PROCEDURE `test`()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE (i <= 10) DO
    INSERT INTO `testdb`.`table01`(`id`,`name`) VALUES (i,'testaaaa');
    SET i = i + 1;
    END WHILE;
END;$$
DELIMITER ;

-- 调用存储过程
CALL test();

/* MySQL批量插入数据,举例 */

-- 如果存储过程已存在,先删除
DROP PROCEDURE test;

DELIMITER $$
CREATE PROCEDURE test()
BEGIN 
   DECLARE i INT  DEFAULT 1;
   WHILE (i<=10) DO
     INSERT INTO test03.test_2(id,name,info) VALUES(i,'aaa','bbb');
     SET i=i+1;
   END WHILE;
COMMIT;
END $$
DELIMITER ;

-- 调用存储过程
CALL test();

2.Oarcle批量插入数据

# sys用户登录,grant execute on dbms_xxxx to xxx 来赋下权限才可以
# grant execute on dbms_output to USER01
# grant execute on dbms_lock to USER01
 


-- eg01
BEGIN
FOR i in 1 .. 2000
  loop 
    INSERT INTO "USER01"."TABLE01" ("RYNBID", "COL02", "COL03", "COL04") VALUES (i, 'aaa', 'bbb', 'ccc');
  END loop;
  commit;
END;
/


-- eg02
BEGIN
FOR i in 1 .. 2000
  loop 
    INSERT INTO "USER01"."TABLE01" ("RYNBID", "COL02", "COL03", "COL04") VALUES (i, 'aaa', 'bbb', 'ccc');
    IF MOD(i,50) = 0 THEN
      commit;
      dbms_output.put_line('to commit, i = '||i||''); 
      dbms_lock.sleep(1);
    END IF;
  END loop;
  commit;
END;
/

-- 注意:
-- 上面内容如果是直接在命令行终端执行、或者navicat都可以执行,但DBeaver无法执行。
-- 如果要在DBeaver中执行,必须创建存储过程、执行存储过程的方式,参考如下:

-- eg03
CREATE OR REPLACE PROCEDURE WRITEBATCH
IS
BEGIN
FOR i in 1 .. 1000000
  loop 
    INSERT INTO "USER01"."TABLE01" ("RYNBID", "COL02", "COL03", "COL04") VALUES (i, 'aaa', 'bbb', 'ccc');
    IF MOD(i,50000) = 0 THEN
      commit;
    END IF;
  END loop;
  commit;
END;
/

CALL WRITEBATCH();
-- 或者
BEGIN 
    WRITEBATCH();
END;


DROP PROCEDURE WRITEBATCH;



-- eg04
-- Oracle 批量生成随机内容测试数据(数据内容为随机值),FOR LOOP
-- CREATE OR REPLACE PROCEDURE MYPROC
-- IS
BEGIN
    FOR i in 1 .. 1000000
        LOOP
            INSERT INTO "TEST"."TB_TEST01" ("ID", "STR01", "STR02", "STR03", "STR04", "STR05", "STR06", "STR07", "STR08", "STR09") VALUES (i, (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',230) FROM dual), (select DBMS_RANDOM.STRING('x',208) FROM dual));
            IF MOD(i,50000) = 0 THEN
                COMMIT;
            END IF;
        END LOOP;
    COMMIT;
 END;
/

-- CALL MYPROC();
-- DROP PROCEDURE MYPROC;




-- eg05
-- Oracle 批量生成随机内容测试数据(数据内容为随机值,CNT为100~200范围内的随机值),FOR LOOP,并打印构造数据执行耗时时长
-- DBMS_UTILITY.GET_TIME 精确到1/00秒,例如: start_time: 481297262, end_time: 481301199, 执行耗时(s): 39.37
-- SET SERVEROUTPUT ON;
DECLARE
    start_time NUMBER(38,0);
    end_time NUMBER(38,0);
    seconds NUMBER(38,2);
BEGIN
    start_time := DBMS_UTILITY.GET_TIME;
    FOR i in 1 .. 1000000
        LOOP
            INSERT INTO "TEST"."TB_TEST02" ("ID", "INFO", "CNT") VALUES (i, (select DBMS_RANDOM.STRING('x',50) FROM dual), (select DBMS_RANDOM.VALUE(100,200) FROM dual));
            IF MOD(i,50000) = 0 THEN
                COMMIT;
            END IF;
        END LOOP;
    COMMIT;
    end_time := DBMS_UTILITY.GET_TIME;
    seconds := (end_time - start_time)/100;
    DBMS_OUTPUT.PUT_LINE('  ==>  start_time: ' || start_time || ', end_time: ' || end_time || ', 执行耗时(s): ' || seconds);
 END;
/





-- eg06
-- Oracle 批量生成随机测试数据(数据内容为随机值,CNT为100~200范围内的随机值),LOOP & EXIT WHEN,并打印构造数据执行耗时时长
-- DBMS_UTILITY.GET_TIME 精确到1/00秒,例如: start_time: 481297262, end_time: 481301199, 执行耗时(s): 39.37
-- SET SERVEROUTPUT ON;
DECLARE
    start_time NUMBER(38,0);
    end_time NUMBER(38,0);
    seconds NUMBER(38,2);
    i NUMBER(38,0) := 1;
    i_max NUMBER(38,0) := 1000000;
BEGIN
    start_time := DBMS_UTILITY.GET_TIME;
    LOOP
        INSERT INTO "TEST"."TB_TEST02" ("ID", "INFO", "CNT") VALUES (i, (select DBMS_RANDOM.STRING('x',50) FROM dual), (select DBMS_RANDOM.VALUE(100,200) FROM dual));
        IF MOD(i,50000) = 0 THEN
            COMMIT;
        END IF;
        i := i + 1;
        EXIT WHEN i > i_max;    
    END LOOP;
    COMMIT;
    end_time := DBMS_UTILITY.GET_TIME;
    seconds := (end_time - start_time)/100;
    DBMS_OUTPUT.PUT_LINE('  ==>  start_time: ' || start_time || ', end_time: ' || end_time || ', 执行耗时(s): ' || seconds);
 END;
/


 

3.Oracle中批量删除多表

SELECT 'DROP TABLE '  || table_name || ';' FROM user_tab_comments WHERE  table_name LIKE '%TESTJOB%';

4.PostgreSQL批量插入数据

1)PostgreSQL 批量插入数据(批量造数据、批量生成测试数据)

drop table test02;
create table test02(id int,info varchar(255),primary key(id));
insert into test02(id,info) select i,'test'||i from generate_series(1,100) as i;
select COUNT(*) from test02;
select * from test02 limit 10;

2)表复制(方式创建表)和数据复制,基于已有的表复制

-- 基于已有的表tableA创建相同表结构的表tableB(仅复制表结构、不复制数据)
drop table if exists tableB;
create table tableB like tableA;
-- 或者也可以下面这种方式:
drop table if exists tableB;
create table tableB select * from tableA where false;


-- 基于已有的表tableA创建相同表结构的表tableB(复制表结构、同时复制所有数据)
drop table if exists tableB;
create table tableB select * from tableA;

-- 基于已有的表tableA创建相同表结构的表tableB(复制表结构、同时复制部分数据)
drop table if exists tableB;
create table tableB select * from tableA where id<10;

-- A、B相同结构的两表已经存在时,将一张表的数据插入到另外一张表(B表中的数据插入A表)
insert into tableB select * from tableA where id<10;

-- SELECT INTO 将查询结果集插入到目的表(该方式貌似MySQL不支持):
SELECT id,info,cnt INTO test81_dst_d_tmp FROM test81_dst;

-- SELECT INTO 将查询结果集插入到目的表(MySQL能支持的方式)
DROP TABLE IF EXISTS test81_dst_d_tmp;
CREATE TABLE test81_dst_d_tmp 
(
SELECT a.id,a.info,a.cnt,a.idu FROM test81 a,(
SELECT 
id, MAX(ctimestamp)AS time
FROM test81
GROUP BY id
ORDER BY COUNT(*)DESC)b WHERE a.id=b.id AND a.ctimestamp=b.time AND a.idu='D'
);

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值