Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: connvert dbf sang oracle như thế nào?

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    1

    Mặc định connvert dbf sang oracle như thế nào?

    Có ai biết convert file dbf sang oracle ko ? giúp mình với..

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Cách 1: Sử dụng package này:
    Oracle8 Code:
    1. CREATE OR REPLACE PACKAGE dbase_pkg
    2. AS
    3.  
    4.     -- procedure to a load a table with records
    5.     -- from a DBASE file.
    6.     --
    7.     -- Uses a BFILE to read binary data and dbms_sql
    8.     -- to dynamically insert into any table you
    9.     -- have insert on.
    10.     --
    11.     -- p_dir is the name of an ORACLE Directory Object
    12.     --       that was created via the CREATE DIRECTORY
    13.     --       command
    14.     --
    15.     -- p_file is the name of a file in that directory
    16.     --        will be the name of the DBASE file
    17.     --
    18.     -- p_tname is the name of the table to load from
    19.     --
    20.     -- p_cnames is an optional list of comma separated
    21.     --          column names.  If not supplied, this pkg
    22.     --          assumes the column names in the DBASE file
    23.     --          are the same as the column names in the
    24.     --          table
    25.     --
    26.     -- p_show boolean that if TRUE will cause us to just
    27.     --        PRINT (and not insert) what we find in the
    28.     --        DBASE files (not the data, just the info
    29.     --        from the dbase headers....)
    30.  
    31.     PROCEDURE load_Table( p_dir    IN VARCHAR2,
    32.                           p_file   IN VARCHAR2,
    33.                           p_tname  IN VARCHAR2,
    34.                           p_cnames IN VARCHAR2 DEFAULT NULL,
    35.                           p_show   IN BOOLEAN DEFAULT FALSE);
    36. END;
    37. /
    38.  
    39. AND the BODY IS:
    40.  
    41. CREATE OR REPLACE PACKAGE BODY dbase_pkg
    42. AS
    43.  
    44. -- Might have to change on your platform!!!
    45. -- Controls the byte order of binary integers read in
    46. -- from the dbase file
    47. BIG_ENDIAN      CONSTANT BOOLEAN DEFAULT TRUE;
    48.  
    49. TYPE dbf_header IS RECORD
    50. (
    51.     version    VARCHAR2(25), -- dBASE version number
    52.     YEAR       int,          -- 1 byte int year, add to 1900
    53.     MONTH      int,          -- 1 byte month
    54.     DAY        int,             -- 1 byte day
    55.     no_records int,             -- number of records in file,
    56.                              -- 4 byte int
    57.     hdr_len    int,             -- length of header, 2 byte int
    58.     rec_len    int,             -- number of bytes in record,
    59.                              -- 2 byte int
    60.     no_fields  int           -- number of fields
    61. );
    62.  
    63.  
    64. TYPE field_descriptor IS RECORD
    65. (
    66.     name     VARCHAR2(11),
    67.     TYPE     CHAR(1),
    68.     LENGTH   int,   -- 1 byte length
    69.     decimals int    -- 1 byte scale
    70. );
    71.  
    72. TYPE field_descriptor_array
    73. IS TABLE OF
    74. field_descriptor INDEX BY BINARY_INTEGER;
    75.  
    76.  
    77. TYPE rowArray
    78. IS TABLE OF
    79. VARCHAR2(4000) INDEX BY BINARY_INTEGER;
    80.  
    81.  
    82. g_cursor BINARY_INTEGER DEFAULT dbms_sql.open_cursor;
    83.  
    84.  
    85.  
    86.  
    87. -- Function to convert a binary unsigned integer
    88. -- into a PLSQL number
    89.  
    90. FUNCTION to_int( p_data IN VARCHAR2 ) RETURN NUMBER
    91. IS
    92.     l_number NUMBER DEFAULT 0;
    93.     l_bytes  NUMBER DEFAULT LENGTH(p_data);
    94. BEGIN
    95.     IF (big_endian)
    96.     THEN
    97.         FOR i IN 1 .. l_bytes LOOP
    98.             l_number := l_number +
    99.                               ASCII(SUBSTR(p_data,i,1)) *
    100.                                            POWER(2,8*(i-1));
    101.         END LOOP;
    102.     ELSE
    103.         FOR i IN 1 .. l_bytes LOOP
    104.             l_number := l_number +
    105.                          ASCII(SUBSTR(p_data,l_bytes-i+1,1)) *
    106.                          POWER(2,8*(i-1));
    107.         END LOOP;
    108.     END IF;
    109.  
    110.     RETURN l_number;
    111. END;
    112.  
    113.  
    114. -- Routine to parse the DBASE header record, can get
    115. -- all of the details of the contents of a dbase file from
    116. -- this header
    117.  
    118. PROCEDURE get_header
    119. (p_bfile        IN bfile,
    120.  p_bfile_offset IN OUT NUMBER,
    121.  p_hdr          IN OUT dbf_header,
    122.  p_flds         IN OUT field_descriptor_array )
    123. IS
    124.     l_data            VARCHAR2(100);
    125.     l_hdr_size        NUMBER DEFAULT 32;
    126.     l_field_desc_size NUMBER DEFAULT 32;
    127.     l_flds            field_descriptor_array;
    128. BEGIN
    129.     p_flds := l_flds;
    130.  
    131.     l_data := utl_raw.cast_to_varchar2(
    132.                        dbms_lob.SUBSTR( p_bfile,
    133.                                         l_hdr_size,
    134.                                         p_bfile_offset ) );
    135.     p_bfile_offset := p_bfile_offset + l_hdr_size;
    136.  
    137.     p_hdr.version    := ASCII( SUBSTR( l_data, 1, 1 ) );
    138.     p_hdr.YEAR       := 1900 + ASCII( SUBSTR( l_data, 2, 1 ) );
    139.     p_hdr.MONTH      := ASCII( SUBSTR( l_data, 3, 1 ) );
    140.     p_hdr.DAY        := ASCII( SUBSTR( l_data, 4, 1 ) );
    141.     p_hdr.no_records := to_int( SUBSTR( l_data,  5, 4 ) );
    142.     p_hdr.hdr_len    := to_int( SUBSTR( l_data,  9, 2 ) );
    143.     p_hdr.rec_len    := to_int( SUBSTR( l_data, 11, 2 ) );
    144.     p_hdr.no_fields  := TRUNC( (p_hdr.hdr_len - l_hdr_size)/
    145.                                            l_field_desc_size );
    146.  
    147.  
    148.     FOR i IN 1 .. p_hdr.no_fields
    149.     LOOP
    150.         l_data := utl_raw.cast_to_varchar2(
    151.                          dbms_lob.SUBSTR( p_bfile,
    152.                                           l_field_desc_size,
    153.                                           p_bfile_offset ));
    154.         p_bfile_offset := p_bfile_offset + l_field_desc_size;
    155.  
    156.         p_flds(i).name := RTRIM(SUBSTR(l_data,1,11),CHR(0));
    157.         p_flds(i).TYPE := SUBSTR( l_data, 12, 1 );
    158.         p_flds(i).LENGTH  := ASCII( SUBSTR( l_data, 17, 1 ) );
    159.         p_flds(i).decimals := ASCII(SUBSTR(l_data,18,1) );
    160.     END LOOP;
    161.  
    162.     p_bfile_offset := p_bfile_offset +
    163.                           MOD( p_hdr.hdr_len - l_hdr_size,
    164.                                l_field_desc_size );
    165. END;
    166.  
    167.  
    168. FUNCTION build_insert
    169. ( p_tname IN VARCHAR2,
    170.   p_cnames IN VARCHAR2,
    171.   p_flds IN field_descriptor_array ) RETURN VARCHAR2
    172. IS
    173.     l_insert_statement LONG;
    174. BEGIN
    175.     l_insert_statement := 'insert into ' || p_tname || '(';
    176.     IF ( p_cnames IS NOT NULL )
    177.     THEN
    178.         l_insert_statement := l_insert_statement ||
    179.                               p_cnames || ') values (';
    180.     ELSE
    181.         FOR i IN 1 .. p_flds.COUNT
    182.         LOOP
    183.             IF ( i <> 1 )
    184.             THEN
    185.                l_insert_statement := l_insert_statement||',';
    186.             END IF;
    187.             l_insert_statement := l_insert_statement ||
    188.                             '"'||  p_flds(i).name || '"';
    189.         END LOOP;
    190.         l_insert_statement := l_insert_statement ||
    191.                                            ') values (';
    192.     END IF;
    193.     FOR i IN 1 .. p_flds.COUNT
    194.     LOOP
    195.         IF ( i <> 1 )
    196.         THEN
    197.            l_insert_statement := l_insert_statement || ',';
    198.         END IF;
    199.         IF ( p_flds(i).TYPE = 'D' )
    200.         THEN
    201.  
    202.             l_insert_statement := l_insert_statement ||
    203.                      'to_date(:bv' || i || ',''yyyymmdd'' )';
    204.         ELSE
    205.             l_insert_statement := l_insert_statement ||
    206.                                                 ':bv' || i;
    207.         END IF;
    208.     END LOOP;
    209.     l_insert_statement := l_insert_statement || ')';
    210.  
    211.     RETURN l_insert_statement;
    212. END;
    213.  
    214.  
    215. FUNCTION get_row
    216. ( p_bfile IN bfile,
    217.   p_bfile_offset IN OUT NUMBER,
    218.   p_hdr IN dbf_header,
    219.   p_flds IN field_descriptor_array ) RETURN rowArray
    220. IS
    221.     l_data     VARCHAR2(4000);
    222.     l_row   rowArray;
    223.     l_n     NUMBER DEFAULT 2;
    224. BEGIN
    225.     l_data := utl_raw.cast_to_varchar2(
    226.                    dbms_lob.SUBSTR( p_bfile,
    227.                                     p_hdr.rec_len,
    228.                                     p_bfile_offset ) );
    229.     p_bfile_offset := p_bfile_offset + p_hdr.rec_len;
    230.  
    231.     l_row(0) := SUBSTR( l_data, 1, 1 );
    232.  
    233.     FOR i IN 1 .. p_hdr.no_fields LOOP
    234.         l_row(i) := RTRIM(LTRIM(SUBSTR( l_data,
    235.                                         l_n,
    236.                                         p_flds(i).LENGTH ) ));
    237.         IF ( p_flds(i).TYPE = 'F' AND l_row(i) = '.' )
    238.         THEN
    239.             l_row(i) := NULL;
    240.         END IF;
    241.         l_n := l_n + p_flds(i).LENGTH;
    242.     END LOOP;
    243.     RETURN l_row;
    244. END get_row;
    245.  
    246.  
    247. PROCEDURE show( p_hdr    IN dbf_header,
    248.                 p_flds   IN field_descriptor_array,
    249.                 p_tname  IN VARCHAR2,
    250.                 p_cnames IN VARCHAR2,
    251.                 p_bfile  IN bfile )
    252. IS
    253.     l_sep VARCHAR2(1) DEFAULT ',';
    254.  
    255.     PROCEDURE p(p_str IN VARCHAR2)
    256.     IS
    257.         l_str LONG DEFAULT p_str;
    258.     BEGIN
    259.         WHILE( l_str IS NOT NULL )
    260.         LOOP
    261.             dbms_output.put_line( SUBSTR(l_str,1,250) );
    262.             l_str := SUBSTR( l_str, 251 );
    263.         END LOOP;
    264.     END;
    265. BEGIN
    266.     p( 'Sizeof DBASE File: ' || dbms_lob.getlength(p_bfile) );
    267.  
    268.     p( 'DBASE Header Information: ' );
    269.     p( CHR(9)||'Version = ' || p_hdr.version );
    270.     p( CHR(9)||'Year    = ' || p_hdr.YEAR   );
    271.     p( CHR(9)||'Month   = ' || p_hdr.MONTH   );
    272.     p( CHR(9)||'Day     = ' || p_hdr.DAY   );
    273.     p( CHR(9)||'#Recs   = ' || p_hdr.no_records);
    274.     p( CHR(9)||'Hdr Len = ' || p_hdr.hdr_len  );
    275.     p( CHR(9)||'Rec Len = ' || p_hdr.rec_len  );
    276.     p( CHR(9)||'#Fields = ' || p_hdr.no_fields );
    277.  
    278.     p( CHR(10)||'Data Fields:' );
    279.     FOR i IN 1 .. p_hdr.no_fields
    280.     LOOP
    281.         p( 'Field(' || i || ') '
    282.              || 'Name = "' || p_flds(i).name || '", '
    283.              || 'Type = ' || p_flds(i).TYPE || ', '
    284.              || 'Len  = ' || p_flds(i).LENGTH || ', '
    285.              || 'Scale= ' || p_flds(i).decimals );
    286.     END LOOP;
    287.  
    288.     p( CHR(10) || 'Insert We would use:' );
    289.     p( build_insert( p_tname, p_cnames, p_flds ) );
    290.  
    291.     p( CHR(10) || 'Table that could be created to hold data:');
    292.     p( 'create table ' || p_tname );
    293.     p( '(' );
    294.  
    295.     FOR i IN 1 .. p_hdr.no_fields
    296.     LOOP
    297.         IF ( i = p_hdr.no_fields ) THEN l_sep := ')'; END IF;
    298.         dbms_output.put
    299.         ( CHR(9) || '"' || p_flds(i).name || '"   ');
    300.  
    301.         IF ( p_flds(i).TYPE = 'D' ) THEN
    302.             p( 'date' || l_sep );
    303.         ELSIF ( p_flds(i).TYPE = 'F' ) THEN
    304.             p( 'float' || l_sep );
    305.         ELSIF ( p_flds(i).TYPE = 'N' ) THEN
    306.             IF ( p_flds(i).decimals > 0 )
    307.             THEN
    308.                 p( 'number('||p_flds(i).LENGTH||','||
    309.                               p_flds(i).decimals || ')' ||
    310.                               l_sep );
    311.             ELSE
    312.                 p( 'number('||p_flds(i).LENGTH||')'||l_sep );
    313.             END IF;
    314.         ELSE
    315.             p( 'varchar2(' || p_flds(i).LENGTH || ')'||l_sep);
    316.         END IF;
    317.     END LOOP;
    318.     p( '/' );
    319. END;
    320.  
    321.  
    322. PROCEDURE load_Table( p_dir IN VARCHAR2,
    323.                       p_file IN VARCHAR2,
    324.                       p_tname IN VARCHAR2,
    325.                       p_cnames IN VARCHAR2 DEFAULT NULL,
    326.                       p_show IN BOOLEAN DEFAULT FALSE )
    327. IS
    328.     l_bfile      bfile;
    329.     l_offset  NUMBER DEFAULT 1;
    330.     l_hdr     dbf_header;
    331.     l_flds    field_descriptor_array;
    332.     l_row      rowArray;
    333. BEGIN
    334.     l_bfile := BFILENAME( p_dir, p_file );
    335.     dbms_lob.fileopen( l_bfile );
    336.  
    337.     get_header( l_bfile, l_offset, l_hdr, l_flds );
    338.  
    339.     IF ( p_show )
    340.     THEN
    341.         show( l_hdr, l_flds, p_tname, p_cnames, l_bfile );
    342.     ELSE
    343.         dbms_sql.parse( g_cursor,
    344.                         build_insert(p_tname,p_cnames,l_flds),
    345.                         dbms_sql.native );
    346.  
    347.         FOR i IN 1 .. l_hdr.no_records LOOP
    348.             l_row := get_row( l_bfile,
    349.                               l_offset,
    350.                               l_hdr,
    351.                               l_flds );
    352.  
    353.             IF ( l_row(0) <> '*' ) -- deleted record
    354.             THEN
    355.                 FOR i IN 1..l_hdr.no_fields LOOP
    356.                     dbms_sql.bind_variable( g_cursor,
    357.                                             ':bv'||i,
    358.                                             l_row(i),
    359.                                             4000 );
    360.                 END LOOP;
    361.                 IF ( dbms_sql.EXECUTE( g_cursor ) <> 1 )
    362.                 THEN
    363.                     raise_application_error( -20001,
    364.                                  'Insert failed ' || SQLERRM );
    365.                 END IF;
    366.             END IF;
    367.         END LOOP;
    368.     END IF;
    369.  
    370.     dbms_lob.fileclose( l_bfile );
    371. EXCEPTION
    372.     WHEN OTHERS THEN
    373.         IF ( dbms_lob.isopen( l_bfile ) > 0 ) THEN
    374.             dbms_lob.fileclose( l_bfile );
    375.         END IF;
    376.         RAISE;
    377. END;
    378.  
    379. END;
    380. /

    Chi tiết tại: _http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:711825134415

    Cách 2: Sử dụng tool ở đính kèm
    Attached Files Attached Files
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    1

    Cho mình hỏi cách làm ngược lại chuyển từ Oracle sang file DBF với.

Các đề tài tương tự

  1. Kết nối DB Oracle Server không cần cài Oracle Client
    Gửi bởi ducvu153 trong diễn đàn Thắc mắc Oracle
    Trả lời: 3
    Bài viết cuối: 04-02-2015, 09:15 AM
  2. Database Convert Database từ FoxPro sang Oracle
    Gửi bởi longttth trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 23-03-2012, 08:37 AM
  3. Lỗi Driver khi kết nối C# với Oracle, xử lý thế nào?
    Gửi bởi hc1987 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 0
    Bài viết cuối: 12-01-2012, 09:12 AM
  4. Check constrain của oracle như thế nào?
    Gửi bởi khanhkhoa trong diễn đàn Thắc mắc Oracle
    Trả lời: 1
    Bài viết cuối: 19-04-2009, 06:29 PM
  5. Cách tạo Oracle Database như thế nào?
    Gửi bởi coldwinter trong diễn đàn Thắc mắc Oracle
    Trả lời: 1
    Bài viết cuối: 21-06-2007, 07:55 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn