开发者

External Tables - "partial record at end of file" error when using FIXED

开发者 https://www.devze.com 2023-04-13 03:31 出处:网络
I am getting a \"partial record at end of file\" error when using FIXED parameter with External Tables.

I am getting a "partial record at end of file" error when using FIXED parameter with External Tables.

I am using SQL Developer, Oracle 11g XE.

-------
foo.dat - Field lengths: fname=7;lname=8;year=4
-------
Alvin  Tolliver1976
KennethBaer    1963
Mary   Dube    1973 

Here is the DDL for the table:

CREATE TABLE emp_load (
    first_name CHAR(7)
    , last_name CHAR(8)
    , year_of_birth CHAR(4)
)
  ORGANIZATION EXTERNAL (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY ext_tab_dir
     ACCESS PARAMETERS (
           RECORDS FIXED 20 FIELDS (
               first_name CHAR(7)
               , last_name CHAR(8)
               ,  year_of_birth CHAR(4)
               )
      )
      LOCATION ('foo.dat'));

The table emp_load is getting created, but select statement fails with below error message. Error message when doing select * from emp_load :

ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-29400: data cartridge error
KUP-04018: <b>partial record at end of file C:\oracle\foo.dat</b>
29913. 00000 -  "error in executing %s callout"
*Cause:    The execution of the specified callout caused an error.
*Action:   Examine the error messages take appropriate action.

The only time it worked is when I made foo.dat 1 line (as below) and I changed the FIXED length to 19-

Alvin  Tolliver1976KennethBaer    1963Mary   Dube    1973

This seems to indicate that I am doing something wrong with regards to newline characters, bu开发者_如何学Pythont I cannot figure out what.

Any help would be appreciated. Thanks in advance!


You are missing a newline character after the last line in your multi-line data file. I.e your last line length is 19 bytes not 20 bytes. You can check the size of your data file - it should be 3 * 20 = 60 bytes.

When you change the data file to have all data in a single line and use RECORDS FIXED 19 everything is again well because now newline is not expected.


I found the answer..

The documentation says that FIXED assumes a newline character at the end.

In Windows, newline (\r\n) takes up 2 bytes.
So, in Windows, the length to be passed to FIXED should be = total length of fields + 2
In Unix, it should be = total length of fields + 1

I have installed the Oracle 11g on my Windows Vista machine. So 21 is the total length instead of 20.

The example in the documentation was probably for Unix which uses 1 byte for newline (\n)

So, this is the correct code if Oracle 11g is installed on Windows -

CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth CHAR(4))
  ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY filesdir
                         ACCESS PARAMETERS (RECORDS FIXED 21 FIELDS 
                                              (first_name CHAR(7),
                                               last_name CHAR(8),
                                               year_of_birth CHAR(4)))
                         LOCATION ('info1.dat'));

Thanks ypercube for the alternative solution. I have upvoted your suggestion. (ypercube's suggestion to use DELIMITED BY NEWLINE provided an alternative, actually an easier solution. But I wanted to post the above since I think it will be useful to someone trying to use the example from the Oracle documentation for FIXED.)

0

精彩评论

暂无评论...
验证码 换一张
取 消