如何将用户生成的 Oracle EBS 电子表格转换为 SQL 驱动的脚本?

How do I convert a user-generated Oracle EBS spreadsheet into a SQL-driven script?

我需要将手动创建的电子表格转换为 SQL 报告。该报告是通过 Oracle Forms(BI Suite 应用程序之一)生成的。

有一个收件箱,其中有许多票据,由 "Request Number"

标识

每个请求编号都是系统中的一个服务台工单。这是该电子表格的屏幕截图:

列的完整列表(带描述):

Request No. 
Modules
Submitted ( the request being submitted , a timestamp )
Supervisor ( the request being approved , by supervisor )
Average Supervisor Approval Duration
Responsibility
Average Resp. Approval Duration
Training (the request being approved for completing training)
Average Training Approval Duration - 
Configuration - depending on whether its PRISM or iProcurement
Average Config. Approval Duration
Approved
Total Overall Duration
Security 
Average Security  Approval Duration
SOD 
Avg SOD Approval Duration

所以我想做的是使用 SQL 脚本生成其中的一部分或全部。

我的一个问题是..对于特定的 "Request Number" 我经常会在数据库中得到冗余和冲突的数据。

以下是我目前的查询。

SELECT   hur.reg_request_id AS "Request No", 
     RESPONSIBILITY_NAME AS "Module", 
     to_char(hur.creation_date, 'DD-Mon-YYYY HH24:MI:SS') AS "Submitted" ,  
     to_char(hur.last_update_date,    'DD-Mon-YYYY HH24:MI:SS') AS "Supervisor" ,     
     ROUND((hur.last_update_date - hur.creation_date), 3 ) || 
           ' days' AS "Avg Supervisor Appr Duration" ,          
     /* hura.creation_date AS "Responsibility" */, 
     NULL AS "Avg Resp Appr Duration", NULL AS "Training",     
     NULL AS "Avg Training Appr Duration" , 
     hur.LAST_UPDATE_DATE AS "Security", 
     NULL AS "Avg Security Appr Duration",     
     NULL AS "SOD", 
     NULL AS "Average SOD Approval Duration" , 
     NULL AS "Configuration",      
     NULL AS "Avg Config Appr Duration",       
     hurr.last_update_date AS "Approved", 
     ROUND( hurr.last_update_date - hur.creation_date, 2 )  
              AS  "Total Overall Duration",     
     NULL AS "Notes"           

     FROM HHS_UMX_REG_SERVICES hur     
        JOIN fnd_responsibility_vl frt 
          ON (hur.responsibility_id = frt.responsibility_id and
              hur.responsibility_application_id = frt.application_id)
    JOIN 
         hhs_umx_reg_requests hurr ON 
           (hurr.reg_request_id = hur.reg_request_id )

       /* JOIN hhs_umx_resp_activity  hura */
      left outer JOIN 
          hhs_umx_resp_activity  
          hura ON (hur.reg_request_id = hura.reg_request_id )--ADD ON 

      WHERE EXISTS (
          SELECT  NULL  FROM hhs_umx_resp_activity hura
      WHERE hura.created_by = hur.created_by 
          AND
      hura.creation_date > hur.creation_date)
          AND hur.reg_request_id IN 
           ('263428', '263458', '263473', 
            '264717', '263402', '263404', 
            '262671', '263229', '263268')                        
      ORDER BY hur.reg_request_id ASC

这是架构:

HHS_UMX_RESP_ACTIVITY

HHS_UMX_REG_SERVICES

fnd_responsibility_vl

**hhs_umx_reg_requests**

谢谢

我已经用 Perl 做过很多次了。有用于读取电子表格的包,因此只需编写脚本即可生成所需的插入语句。然后将它写入一个漂亮的 .SQL 文本文件,然后可以由 SQL 开发人员或您正在使用的任何 IDE 执行。或者直接从 Perl 脚本执行它。

作为一个简单的解决方案,您可以只创建在 SQL 命令中将列相加的行。像 "INSERT INTO TABLE ('REQ_NO', 'MODULE') VALUES (A2, B2)" 之类的东西。然后你可以使用 excel 函数为每一行一次又一次地复制它。

另一个简单的解决方案是将电子表格另存为 CSV(尝试使用确切的 CSV 格式以查看适合您的格式),然后您可以将其导入 SQL table 在那里玩。

当然还有像 TommCatt 指出的其他更高级的解决方案。

如果没有重现问题的样本表(只有几行),很难诊断。
我认为您的重复数据来自错误的连接。
您可以尝试从查询中完全删除 hhs_umx_resp_activity(我看到您评论了使用它的地方)。
然后,如果它继续,它必须与 hhs_umx_reg_requests 上的连接相关(您可以连接一个额外的列或用其他东西替换此连接,例如 outer apply)。