oracle 在PL/SQL中处理原始数据而不创建表

nzk0hqpo  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(137)

Maven们
我必须处理电子邮件中收到的原始数据。这是一次请求,所以我试图找出简单有效的方法来处理它,而无需创建表。
原始数据有3列,最多可达100条记录。请参见下面的原始数据样本:
x1c 0d1x的数据
我创建了一个接受参数的存储过程:participant_id, category_nmbr, group_id并创建必要的事务。
我试图找出创建一个 Package 程序(匿名PL/SQL块)的最佳方法,该程序从原始数据中读取每一行,并使用上述参数调用存储过程。
我确实研究了复合数据类型,但是,我希望尽可能地保持实现的简单性,而不创建表和类型对象(如果可能的话)
感谢帮助!
TIA

i2loujxw

i2loujxw1#

如果不想将数据加载到表中,则可以选择创建一个外部表,该表是存储在文件系统目录中的文件的 * 指针 *,并且可以通过Oracle目录对象访问。
由于您不能自己创建它(作为普通用户),您必须与DBA交谈,以便为您准备(创建目录,授予权限)。
然后创建一个外部表,并使用已经编写的过程处理它。 Package 器过程(或匿名PL/SQL块)很简单-只需循环所有行,例如

begin
  for cur_r in (select participant_id, category_nmbr, group_id
                from the_external_table)
  loop
    your_procedure (cur_r.participant_id, cur_r.category_nmbr, cur_r.group_id);
  end loop;
end;

字符串
如果您更愿意将数据加载到表中,则可以使用SQL Loader实用程序,该实用程序不需要DBA操作,因为文件可以驻留在您自己的PC上。您将创建目标表、控制文件(它指示实用程序如何加载数据)、执行加载操作,并在数据准备就绪后使用我之前发布的PL/SQL块。
还有一个选择是使用UTL_FILE内置包读取文件内容,但它同样需要目录对象,并且可能比以前的选项更复杂。

dbf7pr2w

dbf7pr2w2#

这是为我工作的解决方案。我必须将每列数据转换为CSV,然后对每列使用以下查询来获取数据

WITH t_prctpnt_id
     AS (SELECT ROWNUM ptcpt_row_id,
                TO_CHAR (TO_NUMBER (db_id.COLUMN_VALUE)) participant_id
           FROM XMLTABLE ('101, 102, 203,204') db_id),
     t_ctgry_id
     AS (SELECT ROWNUM ctgry_row_id,
                TO_CHAR (TO_NUMBER (ctgry_id.COLUMN_VALUE)) category_nmbr
           FROM XMLTABLE ('1000, 1000, 2000, 2000') ctgry_id),
     t_grp_id
     AS (    SELECT DISTINCT ROWNUM grp_row_id,
                             TRIM (REGEXP_SUBSTR (GRP_ID,
                                                  '[^,]+',
                                                  1,
                                                  LEVEL))
                                GROUP_ID
               FROM (SELECT ROWNUM, GRP_ID
                       FROM (SELECT 'AB, CD, EF, GH' GRP_ID FROM DUAL)) t
         CONNECT BY INSTR (GRP_ID,
                           ',',
                           1,
                           LEVEL - 1) > 0
           ORDER BY ROWNUM)
SELECT participant_id, category_nmbr, group_id
  FROM t_prctpnt_id d, t_ctgry_id P, t_grp_id g
 WHERE d.ptcpt_row_id = p.ctgry_row_id AND p.ctgry_row_id = g.grp_row_id

字符串

相关问题