将非传输数据转储到位置文件中

时间:2012-07-24 09:11:13

标签: oracle plsql oracle11g plsqldeveloper

我想在位置文件中写入数据。只会写入以前未在文件中写入的数据。显然,表中有一列用于确定数据是否已经写过。

就我而言,如果字段长度为80但数据长度为30,则剩余的空间将填充空格。例如,

----------------------------------------
|  Name    |    SSN      |  Integrated |
----------------------------------------
| Doe      |  453214     |     Y       |
| John     |  1234567890 |     N       |
| Scarlett |  123        |     N       |
----------------------------------------

第一条记录已在先前的文件中传输/写入。因此,它不会在下一个文件中传输。名称长度固定为80个字符。因此,如果名称少于80个字符,则空格的其余部分将填充空格。它看起来像这样。其他领域也是如此

Name           SSN         
John           1234567890
Scarlett       123

我怎么能这样做?提前致谢。我使用的是oracle 11g。

修改

好的,我可以编写代码了。但是,我想将此代码称为可在dbms_jobs中使用的过程。问题是我不知道如何编写程序。

DECLARE
    v_file UTL_FILE.file_type;
BEGIN
    v_file := UTL_FILE.fopen('DIR_VR_AD_INTEGRATION', 'HRMtoAD1_'||sysdate, 'w', 32767);

    FOR x IN (select * from (select RPAD(user_id, 7, ' ') || ' ' || RPAD(pid_company_id, 10, ' ') str from arc_hrvr.vr_ad_integration where integrated = 'N') str where rownum <= 3 order by rownum)
    LOOP
        BEGIN
            UTL_FILE.put_line(v_file, x.str);
         END;
     END LOOP;

    UTL_FILE.fflush(v_file);
    UTL_FILE.fclose(v_file);
END;

1 个答案:

答案 0 :(得分:1)

这实际上是一个与你开始时不同的问题,以及它的标题。你已经弄清楚了你需要做的大部分事情,这很好,但这应该是一个单独的问题。然而,这本来是相当模糊的,所以我不妨在这里做一下......

关于程序编写的documentation非常清楚,并且有很多例子,例如this one,这是Google首次针对'oracle create procedure'打出的。

目前您有一个匿名的PL / SQL块,因此您需要将其转换为存储过程。在这种情况下,假设您不希望它成为包的一部分,您只需将DECLARE更改为CREATE PROCEDURE my_procedure_name AS

CREATE PROCEDURE my_procedure_name AS
    v_file UTL_FILE.file_type;
BEGIN
   ...
END;
/