如何自动地分列从数据库中提取数据?

(原创作者:陈玓玏)

方法有两个,如下:

一、 数据库(Oracle)中写入for循环

       

  1. DECLARE  
  2.    a number(30) :0;  
  3. BEGIN  
  4.    for i in 1 .. 10 loop  
  5.       --INSERT INTO FW_TEST(NAME) VALUES('bbb' + i);  
  6.        sys.dbms_output.put_line('bbb' || i);  
  7.    end loop;  
  8.    commit;  

  1. 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

  这个方法方便倒是挺方便的,就是可能会有效率问题,这个问题之后再去探究、优化吧。



猜你喜欢

转载自blog.csdn.net/weixin_39750084/article/details/80554917