如何通过PowerQuery将Excel数据导入Oracle数据库
用PowerQuery将Excel数据导入Oracle并创建新表
PowerQuery的Odbc.Query仅用于查询读取数据,无法直接执行写入操作。要实现Excel数据导入Oracle并创建新表,需要通过Odbc.Execute方法执行DDL(建表)和DML(插入)语句,具体步骤如下:
1. 准备Excel数据源
先将需要导入的Excel数据加载到PowerQuery编辑器:
- 选中数据区域 → 「数据」选项卡 → 「从表格/区域」 → 整理数据(确保列名无特殊字符、数据类型与Oracle兼容,比如日期列统一为Date类型,数字列统一为Number类型)
2. 编写自定义M函数实现写入
在PowerQuery编辑器中,点击「主页」→ 「新建源」→ 「空白查询」,将下面的M代码粘贴进去,命名为InsertToOracle:
let InsertToOracle = (serverDSN as text, targetTable as text, sourceData as table) as table => let // 获取数据源的列名和类型 ColNames = Table.ColumnNames(sourceData), ColTypes = Table.ColumnTypes(sourceData), // 映射Excel数据类型到Oracle数据类型(可根据实际需求调整) OracleColTypes = List.Transform(ColTypes, each if _ type number then "NUMBER" else if _ type text then "VARCHAR2(255)" else if _ type date then "DATE" else "VARCHAR2(255)" ), // 生成CREATE TABLE语句 CreateTableSQL = "CREATE TABLE " & targetTable & " (" & Text.Combine(List.Zip({ColNames, OracleColTypes}), ", ") & ");", // 执行建表操作 CreateResult = Odbc.Execute(serverDSN, CreateTableSQL), // 生成INSERT语句模板(参数化查询避免SQL注入) InsertSQLTemplate = "INSERT INTO " & targetTable & " (" & Text.Combine(ColNames, ", ") & ") VALUES (" & Text.Combine(List.Repeat({"?"}, List.Count(ColNames)), ", ") & ");", // 逐行插入数据 InsertResults = Table.AddColumn(sourceData, "插入状态", each Odbc.Execute(serverDSN, InsertSQLTemplate, {Record.ToList(_)})) in InsertResults in InsertToOracle
3. 调用函数执行导入
回到你的数据源查询(比如命名为SourceData),在「添加列」→ 「自定义列」中调用函数:
= InsertToOracle("dsn=SERVER", "SERVER.TABLE_NEW", SourceData)
dsn=SERVER:替换为你的Oracle ODBC数据源名称SERVER.TABLE_NEW:目标Oracle表名(SERVER为用户名/ schema,需确保当前ODBC用户有该schema的建表、插入权限)SourceData:你的Excel数据源查询名称
注意事项
- 权限:确保ODBC连接的Oracle用户拥有
CREATE TABLE和INSERT权限 - 数据类型:需根据实际数据调整类型映射(比如长文本用
CLOB,高精度数字用NUMBER(18,2)等) - 性能:逐行插入适合小数据量,大数据量建议改为批量插入(比如每1000行生成一条多值INSERT语句)
- 测试:可先单独执行
CreateTableSQL语句验证建表语法是否正确
内容的提问来源于stack exchange,提问作者Horaci
相关产品推荐
相关产品推荐

