(原创作者:陈玓玏)
方法有两个,如下:
一、 数据库(Oracle)中写入for循环
- DECLARE
- a number(30) := 0;
- BEGIN
- for i in 1 .. 10 loop
- --INSERT INTO FW_TEST(NAME) VALUES('bbb' + i);
- sys.dbms_output.put_line('bbb' || i);
- end loop;
- commit;
- END;
参考链接:https://blog.csdn.net/fengchao2016/article/details/59712039
虽然原作者没说明,但是这个应该是用到了存储过程,我也没见到过不需要存储过程,直接使用for循环的sql语句。
如果是用MySQL,存储过程的写法是一样的,都是先定义过程名、声明变量,然后定义过程,只是MySQL中循环语句的写法和Oracle不一样。
官方解释:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
官方的简单例子如下:
CREATE
PROCEDURE
order_tot_amt #创建名为order_tot_amt的存储过程
@o_id
int
, #定义输入变量
@p_tot
int
output #定义输出变量
AS #结束声明部分,开始写函数流程
SELECT
@p_tot =
sum
(Unitprice*Quantity) #简单的选择语句,未用到循环语句
FROM
orderdetails
WHERE
orderid=@o_id
GO
执行这个存储过程:
exec
order_tot_amt
3
,@p_tot
output
print
'结果为'
+
convert
(
varchar
,@p_tot)
go
如果使用存储过程,需要注意的是你最好有数据库操作权限,因为存储过程要写在数据库里面,如果没有操作权限,
可能会用不了这种方法,那就可以用第二种方法。
除了for循环,还可以在存储过程中写游标索引,参考:https://www.cnblogs.com/zgz21/p/5864298.html
declare
--定义游标并且赋值(is 不能和cursor分开使用)
cursor
stus_cur
is
select
*
from
students;
--定义rowtype
cur_stu students%rowtype;
/*开始执行*/
begin
--开启游标
open
stus_cur;
--loop循环
loop
--循环条件
exit
when
stus_cur%notfound;
--游标值赋值到rowtype
fetch
stus_cur
into
cur_stu;
--输出
dbms_output.put_line(cur_stu.
name
);
--结束循环
end
loop;
--关闭游标
close
stus_cur;
/*结束执行*/
end
;
二、 在Python中使用for循环:
我用的方法是先在数据库中导出表格的描述,包括列名、数据类型等,再用python读取列名,然后通过for循环对
每列excecutesql语句,最后再统一存储到Excel中。
Oracle数据库:
用cx_Oracle库,
conn = cx_Oracle.connect("username/password@serveraddress/databasetype") #连接数据库
path = "tabledir"
table = pd.read_excel(path) #读取Excel文件
sql_bill = "sql process"
data_psi = pd.read_sql_query(sql_bill, conn)
columns = data_psi.columns #从数据库中获取列名
#获取列名的第二种方法:
#address=pd.read_csv("filepath",usecols=[0],encoding='gbk') #直接从导出的数据表描述文件中获取第一列,即列名
for i in columns: #用for循环对每一列进行同样的操作
sql_not_null = "select count(%s) from tablename where %s is not null" %(i,i)
dt_not_null = pd.read_sql_query(sql_not_null,conn) #把sql语句的返回结果转换为pandas中的DataFrame格式
dt_cat = pd.read_sql_query(sql_cat, conn)
table.loc[table['not null'].count(),['not null']] = int(dt_not_null.values) #使用loc按照index和columns值将数据填入相应的位置
table.to_excel('filename',header = True) #把DataFrame格式数据写入Excel
这个方法方便倒是挺方便的,就是可能会有效率问题,这个问题之后再去探究、优化吧。