powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание DBF из пакета Oracle
19 сообщений из 19, страница 1 из 1
создание DBF из пакета Oracle
    #33275736
Joker_Ya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка такая необходимо создавать из пакета dbf файла (формат dBase IV) на диске (структура dbf файла генерируется по данным из таблиц динамически) и заполнение его данными. Есть ли какие либо родные пакеты которые позволяют создать и работать с Dbf ?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
создание DBF из пакета Oracle
    #34579425
NB52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joker_YaЗадачка такая необходимо создавать из пакета dbf файла (формат dBase IV) на диске (структура dbf файла генерируется по данным из таблиц динамически) и заполнение его данными. Есть ли какие либо родные пакеты которые позволяют создать и работать с Dbf ?

Получилось у Вас?
И мне пришлось этим заниматься...
Сейчас использую оркл2дбф(структура постоянна), но получается dBase III, а нужен dBase IV - приходится пересохранять(причем пользователям).
Если решили, задачку, поделитесь, как,ПОЖАЛУЙСТА!!!
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34579906
ПЕС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил аналогигчную задачу так:
1. создал редактором дбф (полно в сети) пустой файлик правильно формата.
2. подключаюсь нему из оракла через гетероденный сервис (смотри ФАК), и заполняю обычными insert into
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34579913
ПЕС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joker_Ya(структура dbf файла генерируется по данным из таблиц динамически

сорри, прочитал невнимательно....
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34580017
YAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите
http://citkit.ru/package/jdbf/
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34580216
a398
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YAPпосмотрите
http://citkit.ru/package/jdbf/
А есть опыт его использования из JVM оракла?
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34580244
YAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в продакшене работает уже пару месяцев...
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #34580261
a398
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YAPв продакшене работает уже пару месяцев...
о как. не смущает, что оно несколько древнее?
м.б поделишься готовыми хранимками?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
создание DBF из пакета Oracle
    #35838701
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Как обычно вдруг возникла срочная необходимость генерировать DBF с заданной структурой из Oracle и выкладывать на FTP.

Поиск по форуму дал ссылку на JDBF - http://www.svcon.com/jdbf/index.html
пакет FTP - http://www.oracle-base.com/articles/9i/FTPFromPLSQL9i.php
Дальше:
1) Загрузка JDBF
loadjava -user myuser/mypassword@basa jdbf.jar

2) Java-модуль

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
create or replace and compile java source named exp_dbf as
import com.svcon.jdbf.DBFWriter; 
import com.svcon.jdbf.JDBField; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
import oracle.sql.BLOB;
import oracle.sql.CLOB;
import oracle.jdbc.OracleTypes;
import java.io.*;
import java.sql.*;
import java.sql.CallableStatement;
import oracle.jdbc.driver.*;
import java.io.StringReader;
import java.util.StringTokenizer;


public class TestDbf { 

   /**
     * Парсит одну csv строку.
     * @param line строка
     * @param p_Delim разделитель
     * @return массив столбцов строки
     */
    private static String[] getRowData(String line,String p_Delim) {
        StringTokenizer st = new StringTokenizer(line, p_Delim, false);
        int n = st.countTokens();
        String[] row = new String[n];
        int cn =  0 ;
        while (st.hasMoreElements()) {
            row[cn++] = ((String) st.nextElement()).trim();
        }
        return row;
    }



/**
   Конвертирует результат SQL запроса в формат DBASE4
   и возвращает DBASE 4 как temporary BLOB
   По идее этот temporary BLOB надо бы внешним модулем freed using the DBMS_LOB.FREETEMPORARY?

   В параметр format передается структура генерируемой DBF таблицы в виде
    Название поля;тип;размер;кол-во знаков после запятой
    Название поля;тип;размер;кол-во знаков после запятой
    и т.д.
    Типы:
    N - числовой
    D - дата
    C - текстовый
    Например:
    sum;N;9;0
    dat;D,8;0
    msg;C;70;0
 
     * @param query SQL запрос
     * @param format строка заголовка таблицы
     * @return массив столбцов строки

*/

public static BLOB gen_dbf_struct(String query,String format)  throws SQLException, java.io.IOException{ 

   Connection con = null;
   BLOB blob = null;
   OutputStream out = null;
   InputStream in = null;
   String line="";
   Statement stmt = null;
   ResultSet r = null;
   Object rowData[]=null;
   DBFWriter dw=null;
   ResultSetMetaData metaData=null;
   int colCount= 0 ;
   String name,type,size,prec;
   
    try {
      con=new OracleDriver().defaultConnection();
      Locale.setDefault(Locale.ENGLISH); 
      blob = BLOB.createTemporary(con, true, BLOB.DURATION_SESSION);
      out = blob.getBinaryOutputStream();

     //Распарсить format и сгенерить структуру таблицы
      BufferedReader bR = new BufferedReader(new StringReader(format));
      while ((line = bR.readLine()) != null) colCount++;
      JDBField arrfiled[] = new JDBField[colCount]; 
      bR = new BufferedReader(new StringReader(format));
      String[] dataRow;
      int i= 0 ;
      while ((line = bR.readLine()) != null) {
                    dataRow = getRowData(line,";");
                    name=dataRow[ 0 ];
                    type=dataRow[ 1 ];
                    size=dataRow[ 2 ];
                    prec=dataRow[ 3 ];
                    arrfiled[i] = new JDBField(name,type.charAt( 0 ),Integer.parseInt(size),Integer.parseInt(prec)); 
                    i++;             
       }
      dw = new DBFWriter(out,arrfiled);
      stmt = con.createStatement();
      r = stmt.executeQuery(query);
      metaData = r.getMetaData();
    
     while (r.next()) {
       rowData = new Object[colCount];
       for (i =  0 ; i < colCount; i++) {
          switch(metaData.getColumnType(i+ 1 )){
           
                 /*DATE*/ case  91 : rowData[i]=r.getDate(i+ 1 );break;
              /*NUMERIC*/ case   2 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          case   3 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          case   8 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          default:  rowData[i]=r.getString(i+ 1 ); break;
            }
       }
       dw.addRecord(rowData);
   }

  } catch(Exception ex) { 
          /*
               #sql {rollback};
               String d=ex.getMessage();
               #sql { INSERT INTO logtable (DAT,RESULT,ERRCODE) VALUES (sysdate,:d,1)};              
               #sql {commit};
           */
      } 
     finally{
       if (r != null) r.close();
       if (stmt != null) stmt.close();
       if (out != null) {out.close();}
     //  if(con!=null) con.close();
       try{
       if(dw!=null) dw.close();
              }
       catch(Exception ex) {}
      } 
      return blob;
} 


//Конвертирует результат SQL запроса в формат DBASE4 и возвращает DBASE как temporary BLOB
//По идее этот temporary BLOB надо бы внешним модулем freed using the DBMS_LOB.FREETEMPORARY?
//Принимайте во внимание, что в DBASE есть ограничения на длину названия поля, типы и т.д.
public static BLOB gen_dbf_sql(String query)  throws SQLException, java.io.IOException{ 

   Connection con = null;
   BLOB blob = null;
   OutputStream out = null;
   InputStream in = null;
   String line="";
   Statement stmt = null;
   ResultSet r = null;
   Object rowData[]=null;
   DBFWriter dw=null;
   ResultSetMetaData metaData=null;
   String temp;
   int colCount;
   char type;
    try {
      con=new OracleDriver().defaultConnection();
      stmt = con.createStatement();
      r = stmt.executeQuery(query);
      metaData = r.getMetaData();
      colCount=metaData.getColumnCount();
      JDBField arrfiled[] = new JDBField[colCount]; 
      int size= 10 ;
      for (int i =  0 ; i < colCount; i++) {
           temp=metaData.getColumnName(i+ 1 );
           switch(metaData.getColumnType(i+ 1 )){
           
                 /*DATE*/ case  91 : type='D';size= 8 ;break;
              /*NUMERIC*/ case   2 : type='N';size=metaData.getPrecision(i+ 1 )== 0 ? 10 :metaData.getPrecision(i+ 1 );break;
                          case   3 : type='N';size=metaData.getPrecision(i+ 1 )== 0 ? 10 :metaData.getPrecision(i+ 1 );break;
                          case   8 : type='N';size=metaData.getPrecision(i+ 1 )== 0 ? 10 :metaData.getPrecision(i+ 1 );break;
                          default: type='C';size=metaData.getPrecision(i+ 1 )> 253 ? 253 :metaData.getPrecision(i+ 1 );break;
           }
           if(temp.length()> 9 ) temp=temp.substring( 0 , 9 );
           arrfiled[i] = new JDBField(temp,type,size, 0 );              
       }
     Locale.setDefault(Locale.ENGLISH); 
     blob = BLOB.createTemporary(con, true, BLOB.DURATION_SESSION);
     out = blob.getBinaryOutputStream();
    
     SimpleDateFormat localTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     dw = new DBFWriter(out,arrfiled);

     while (r.next()) {
       rowData = new Object[colCount];
       for (int i =  0 ; i < colCount; i++) {
          switch(metaData.getColumnType(i+ 1 )){
           
                 /*DATE*/ case  91 : rowData[i]=r.getDate(i+ 1 );break;
              /*NUMERIC*/ case   2 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          case   3 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          case   8 : rowData[i]=Double.valueOf(r.getString(i+ 1 ));break;
                          default:  rowData[i]=r.getString(i+ 1 ); break;
            }
       }
       dw.addRecord(rowData);
   }

  } catch(Exception ex) { 
         /*
               #sql {rollback};
               String d=ex.getMessage();
               #sql { INSERT INTO logtable (DAT,RESULT,ERRCODE) VALUES (sysdate,:d,1)};              
               #sql {commit};
         */
      } 
     finally{
       if (r != null) r.close();
       if (stmt != null) stmt.close();
       if (out != null) {out.close();}
     //  if(con!=null) con.close();
       try{
       if(dw!=null) dw.close();
       }
       catch(Exception ex) {}
      } 
      return blob;
} 

} 
/


3) Функции-обертки
Конвертирует результат SQL запроса в формат DBASE4 и возвращает DBASE как temporary BLOB
По идее этот temporary BLOB должен быть freed using the DBMS_LOB.FREETEMPORARY
Код: plaintext
1.
2.
3.
4.
create or replace function java_gen_dbf_sql(p_query in varchar2)
  return BLOB as
  language java name 'TestDbf.gen_dbf_sql(java.lang.String) return blob';
/

Конвертирует результат SQL запроса в формат DBASE4
и возвращает DBASE 4 как temporary BLOB
По идее этот temporary BLOB должен быть freed using the DBMS_LOB.FREETEMPORARY

В параметр format передается структура генерируемой DBF таблицы в виде
Название поля;тип;размер;кол-во знаков после запятой
Название поля;тип;размер;кол-во знаков после запятой
и т.д.
Типы:
N - числовой
D - дата
C - текстовый
Например:
sum;N;9;0
dat;D,8;0
msg;C;70;0

Код: plaintext
1.
2.
3.
4.
5.
create or replace function java_gen_dbf_struct(p_query  in varchar2,
                                               p_format varchar2)
  return BLOB as
  language java name 'TestDbf.gen_dbf_struct(java.lang.String,java.lang.String) return blob';
/
Пример использования

Код: plaintext
1.
2.
3.
select 
java_gen_dbf_struct('select name_type,vers,sysdate dat from mytable','pt;C;100;0'||chr( 10 )||'vers;N;9;0'||chr( 10 )||'dat;D;8;0')
from dual;

Код: plaintext
1.
2.
select 
java_gen_dbf_sql('select name_type, convert(name_type,''RU8PC866'') namtype,vers,sysdate dat from mytable')
from dual;

convert(name_type,''RU8PC866'') - если нужен в досовской кодировке

P.S. Лепил быстро, могут быть косяки.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35849940
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Теперь хочу решить обратную задачу.
На вход функции blob c DBF, на выходе ARRAY.
Чтобы можно было работать с DBF типа:
select * from table (cast( java_dbf2oracle(dbf_blob) as dbf_table))
При этом если структура dbf заранее известна, то понятно как делать.
Но хочется на вход подавать dbf любой структуры и обойтись без генерации/drop временных таблиц, типов. Ну и через генерацию xml не хочется.
Подскажите направление, pls.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35849979
Alterling
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBR, если речь про обычные таблицы, то без генерации типов тут явно не обойтись, т.к. когда вы пишете cast(... as dbf_table), структура того, во что вы кастите должна быть известна.
CAST converts one built-in datatype or collection-typed value into another built-in datatype or collection-typed value.
Чисто теоретически, наверное, можно попробовать с помощью anytype сгенерировать тип "на лету", т.е. без явных create/drop. Но во что это выльется и какие ограничения будут на работу с этим типом я сказать не могу.

Поэтому предлагаю вариант - превратить ваш dbf в xml, т.к. под работу с xml с заранее неопределенной структурой можно найти наработки.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35850021
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Alterling, спасибо за ответ.
Но генерацию xml не хочется делать. Медленно.
Я сейчас смотрю в сторону возврата ref cursor из java процедуры.
Для этого надо умудриться сгенерить ResultSet, а дальше уже понятно.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35850066
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlterlingЧисто теоретически, наверное, можно попробовать с помощью anytype сгенерировать тип "на лету", т.е. без явных create/drop. Но во что это выльется и какие ограничения будут на работу с этим типом я сказать не могу.


http://www.sql.ru/forum/actualthread.aspx?tid=84306&hl=%ed%e0%e7%e2%e0%eb+%e8%e7%e2%f0%e0%f9%e5%ed%e8%e5%ec#611108
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35851801
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Вообщем решил не возиться с ref cursor и сделал тупую конвертацию DBF в XML.
Во вложении весь java-код, может кому пригодится.
Обертка для DBF2XML
Код: plaintext
1.
2.
3.
 create or replace function java_dbf2XML(p_dbf in BLOB, p_conv number)
  return CLOB as
  language java name 'TestDbf.DBF2XML(oracle.sql.BLOB, int) return oracle.sql.CLOB';

p_dbf - блоб, содержащий таблицу DBASE 4,
p_conv - если 1, то конвертирует из DOS кодировки.

Проблема - неправильно преобразовывается буква Ш (вместо Ш-?).
Скорее всего надо будет завтра саму JDBF подправить.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #35852569
VBR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBR
Гость
Поправил Jdbf и все стало работать ок.
Во вложении все необходимое.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
создание DBF из пакета Oracle
    #39270133
user-visio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBR,
у меня с буквой Ш такая же проблема
str_con:=Convert(val_str2,'RU8PC866','CL8MSWIN1251');
и что делать?
временно заменил Ш на ш
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #39270145
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-visio str_con:=Convert(val_str2,'RU8PC866','CL8MSWIN1251');
SQL Reference Note:
Oracle discourages the use of the CONVERT function in the current Oracle Database release. The return value of CONVERT has a character data type, so it should be either in the database character set or in the national character set, depending on the data type. Any dest_char_set that is not one of these two character sets is unsupported. The char argument and the source_char_set have the same requirements.user-visioи что делать?Полагаться на кодировки при работе со строковыми данными внутри БД не верно. Манипулировать кодированием символов только через бинарные данные.
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #39270259
user-visio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBR,
у меня с буквой Ш такая же проблема
str_con:=Convert(val_str2,'RU8PC866','CL8MSWIN1251');
и что делать?
временно заменил Ш на ш
...
Рейтинг: 0 / 0
создание DBF из пакета Oracle
    #39270262
user-visio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и конкретно что делать?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание DBF из пакета Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]