oracle多表筛选自动导出excel

基本情况:名为DB的库(user)内存在T1,T2,T3……等多个表,每个表都有一个Name字段。
目标:T1,T2,T3……中按NAME的不同分别筛选出结果,并将结果导出成一个excel表。如每个表中都存在“张三、李四……”多个名字,多个表按张三搜索,多个表的结果按指定路径导出成“张三”一个工作簿。

额外:按NAME筛选结果,并按路径导出一个dmp。以上操作自动运行,即点击小程序自动运行,不容复制代码,手动点击运行,这是叫脚本??(怎么才能写这个循环的脚本)

参考GPT和自己的思路,这个任务可以通过编写PL/SQL脚本来完成。下面是一个实现该任务的PL/SQL脚本的示例:

DECLARE
  CURSOR c_tables IS SELECT table_name FROM user_tables;
  v_name VARCHAR2(100);
  v_query VARCHAR2(200);
  v_filename VARCHAR2(100);
BEGIN
  FOR t IN c_tables LOOP
    v_name := t.table_name;
    v_query := 'SELECT * FROM ' || v_name || ' WHERE NAME = :1';
    FOR r IN (SELECT DISTINCT NAME FROM v_name) LOOP
      v_filename := r.NAME || '.xlsx';
      SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKBOOK('xlsx', v_filename))
      WHERE sheet_name = r.NAME
      UNION ALL
      SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKSHEET('xlsx', r.NAME))
      WHERE 1=0;
      DBMS_XSLFORMAT.STARTROW();
      DBMS_XSLFORMAT.ADDCELL(v_name);
      DBMS_XSLFORMAT.ADDCELL(r.NAME);
      FOR row IN (SELECT * FROM TABLE(DBMS_SQL.EXECUTE(v_query, r.NAME))) LOOP
        FOR i IN 1..row.COUNT LOOP
          DBMS_XSLFORMAT.ADDCELL(row(i));
        END LOOP;
        DBMS_XSLFORMAT.ENDROW();
      END LOOP;
      DBMS_XSLFORMAT.CLOSESHEET();
    END LOOP;
  END LOOP;
END;

这个脚本首先定义了一个游标,用于获取库中所有表的名称。然后,对于每个表,它使用一个内部游标和一个动态SQL查询来获取不同NAME的所有记录,并将结果添加到指定的Excel工作簿中。为了自动运行该脚本,您可以将它保存为一个PL/SQL脚本文件,然后在数据库中设置一个定时任务来定期运行该脚本。
如果对您有帮助,请给与采纳,谢谢。

要实现这个目标,可以编写一个Python脚本来连接Oracle数据库,执行查询和导出操作。以下是一个基本的代码框架:

import cx_Oracle
import pandas as pd
import os

# 连接Oracle数据库
connection = cx_Oracle.connect('username/password@host:port/sid')

# 定义要查询的名字列表
names = ['张三', '李四', ...]

# 遍历每个名字,分别查询并导出结果
for name in names:
    # 遍历每个表,分别查询并合并结果
    data = pd.DataFrame()
    for table_name in ['T1', 'T2', 'T3', ...]:
        query = f"SELECT * FROM {table_name} WHERE Name = '{name}'"
        df = pd.read_sql(query, connection)
        data = pd.concat([data, df])
    # 将结果导出为Excel表
    output_path = f'/path/to/output/directory/{name}.xlsx'
    data.to_excel(output_path, index=False)
    
    # 可选:将结果导出为dmp文件
    dmp_path = f'/path/to/output/directory/{name}.dmp'
    os.system(f'exp user/password file={dmp_path} tables=T1,T2,T3 query="WHERE Name=\'{name}\'"')
    
# 关闭数据库连接
connection.close()


这个脚本会遍历每个名字,然后遍历每个表,分别执行查询并合并结果。最后,将结果导出为一个Excel表,并可选地将结果导出为dmp文件。您可以将此脚本保存为Python文件,并使用Python解释器运行。

如果您需要在单个表中运行此操作,可以更改查询语句中的表名,如下所示:

query = "SELECT * FROM T1 WHERE Name = '{name}'"



如果需要在多个数据库中运行此操作,可以将连接字符串更改为包括不同的用户名和密码:

connection = cx_Oracle.connect('username1/password1@host1:port1/sid1')
connection = cx_Oracle.connect('username2/password2@host2:port2/sid2')


为了使此脚本可以自动运行,您可以将其保存为一个脚本文件,并在操作系统上设置定时任务(例如使用Windows任务计划程序或Cron作业)。或者,您可以将脚本包装在一个可执行文件或服务中,使其作为后台进程自动运行。

以下答案基于ChatGPT与GISer Liu编写:

实现这个需求需要使用Oracle的PL/SQL语言编写一个存储过程,并使用外部工具如SQL*Plus或SQL Developer来自动执行这个存储过程。下面是一个大致的存储过程示例,供参考:

CREATE OR REPLACE PROCEDURE EXPORT_RESULTS AS
  CURSOR c_tables IS SELECT table_name FROM user_tables;
  v_name VARCHAR2(100);
  v_path VARCHAR2(100);
  v_sql VARCHAR2(1000);
BEGIN
  FOR r_table IN c_tables LOOP
    v_name := r_table.table_name;
    v_path := 'C:\Export\' || v_name || '.xlsx';
    v_sql := 'SELECT * FROM ' || v_name || ' WHERE name = ''张三''';
    EXECUTE IMMEDIATE 'SELECT * FROM (' || v_sql || ') WHERE ROWNUM <= 65535'
      INTO xls_output;
    ORA_EXCEL.new_document;
    ORA_EXCEL.add_sheet('Sheet1');
    ORA_EXCEL.query_to_sheet('Sheet1', v_sql);
    ORA_EXCEL.save_to_file(v_path);
  END LOOP;
END;

这个存储过程使用游标循环遍历所有表,将每个表中名字为“张三”的记录导出到一个Excel工作簿中。注意,这个示例中使用了Oracle的扩展包ORA_EXCEL,如果你没有这个扩展包,可以使用其他外部工具或编程语言来实现Excel的导出功能。

执行这个存储过程可以使用以下命令:

EXECUTE EXPORT_RESULTS;

将这个命令保存到一个脚本文件中,再使用SQL*Plus或SQL Developer等工具来自动运行这个脚本文件即可实现自动化运行。

需要使用Oracle的SQL语句进行多表查询,筛选出不同Name对应的结果,可以使用类似下面的语句:

SELECT * FROM T1 WHERE Name = '张三';
SELECT * FROM T2 WHERE Name = '张三';
SELECT * FROM T3 WHERE Name = '张三';

然后,需要使用PL/SQL语句进行循环,依次执行上述语句,并将结果导出到指定的路径。可以使用类似下面的语句:

DECLARE
  -- 定义变量
  v_name VARCHAR2(50) := '张三';
  v_file_path VARCHAR2(100) := 'C:\Export\' || v_name || '.xlsx';
  v_sql VARCHAR2(200);
BEGIN
  -- 循环查询每个表
  FOR i IN 1..3 LOOP
    -- 构建查询语句
    v_sql := 'SELECT * FROM T' || i || ' WHERE Name = ''' || v_name || '''';
    -- 使用UTL_FILE包将结果导出到文件
    UTL_FILE.WRITE_TEXT(UTL_FILE.FOPEN('C:\Export', v_name || '.txt', 'W'), v_sql);
  END LOOP;
  -- 使用Excel COM对象将结果导出到Excel文件
  ExcelApp := actxserver('Excel.Application');
  Workbook = ExcelApp.Workbooks.Add;
  for i=1:3
      sheet = Workbook.Worksheets.Item(i);
      file_path = 'C:\Export\' || v_name || '_' || i || '.txt';
      sheet.activate();
      range = sheet.Range('A1');
      range.Select;
      range.PasteSpecial;
      delete(file_path);
  end
  Workbook.SaveAs(v_file_path);
  Workbook.Close;
  ExcelApp.Quit;
END;

上面老师们的思路是对的,借用PL/SQL来实现多表筛选自动导出excel

SELECT * FROM A inner join B on A.xx=B.MemberID WHERE A.CreateTime between '20140101' and '20140801'

使用SQL*Plus工具,将查询结果存储为csv文件,再调用Excel的数据导入功能导入。具体操作步骤如下:
1.登录oracle:SQLPLUS username/password@oracle
2.输入查询语句:

SELECT * FROM A inner join B on A.xx=B.MemberID 
WHERE A.CreateTime between '20140101' and '20140801'

3.将查询结果存储为csv文件:
spool文件名.csv
4.执行查询:
select * from A inner join B on A.xx=B.MemberID
where A.CreateTime between '20140101' and '20140801';
5.结束:spool off
6.打开Excel,点击“数据”菜单,选择“从文本导入”。填写csv文件路径,然后按照默认设置选择字段格式即可。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

需要写一个小工具,输入sql 导出你需要的excel数据