Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание DBF из пакета Oracle / 19 сообщений из 19, страница 1 из 1
19.09.2005, 05:24:39
    #33275736
Joker_Ya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Задачка такая необходимо создавать из пакета dbf файла (формат dBase IV) на диске (структура dbf файла генерируется по данным из таблиц динамически) и заполнение его данными. Есть ли какие либо родные пакеты которые позволяют создать и работать с Dbf ?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.06.2007, 22:27:16
    #34579425
NB52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Joker_YaЗадачка такая необходимо создавать из пакета dbf файла (формат dBase IV) на диске (структура dbf файла генерируется по данным из таблиц динамически) и заполнение его данными. Есть ли какие либо родные пакеты которые позволяют создать и работать с Dbf ?

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

сорри, прочитал невнимательно....
...
Рейтинг: 0 / 0
07.06.2007, 10:16:57
    #34580017
YAP
YAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
посмотрите
http://citkit.ru/package/jdbf/
...
Рейтинг: 0 / 0
07.06.2007, 11:04:16
    #34580216
a398
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
YAPпосмотрите
http://citkit.ru/package/jdbf/
А есть опыт его использования из JVM оракла?
...
Рейтинг: 0 / 0
07.06.2007, 11:07:51
    #34580244
YAP
YAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
в продакшене работает уже пару месяцев...
...
Рейтинг: 0 / 0
07.06.2007, 11:10:24
    #34580261
a398
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
YAPв продакшене работает уже пару месяцев...
о как. не смущает, что оно несколько древнее?
м.б поделишься готовыми хранимками?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
26.02.2009, 11:42:47
    #35838701
VBR
VBR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Как обычно вдруг возникла срочная необходимость генерировать 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
04.03.2009, 09:45:32
    #35849940
VBR
VBR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Теперь хочу решить обратную задачу.
На вход функции blob c DBF, на выходе ARRAY.
Чтобы можно было работать с DBF типа:
select * from table (cast( java_dbf2oracle(dbf_blob) as dbf_table))
При этом если структура dbf заранее известна, то понятно как делать.
Но хочется на вход подавать dbf любой структуры и обойтись без генерации/drop временных таблиц, типов. Ну и через генерацию xml не хочется.
Подскажите направление, pls.
...
Рейтинг: 0 / 0
04.03.2009, 10:05:50
    #35849979
Alterling
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
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
04.03.2009, 10:21:26
    #35850021
VBR
VBR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Alterling, спасибо за ответ.
Но генерацию xml не хочется делать. Медленно.
Я сейчас смотрю в сторону возврата ref cursor из java процедуры.
Для этого надо умудриться сгенерить ResultSet, а дальше уже понятно.
...
Рейтинг: 0 / 0
04.03.2009, 10:33:54
    #35850066
DimaR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
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
04.03.2009, 19:48:43
    #35851801
VBR
VBR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Вообщем решил не возиться с 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
05.03.2009, 10:49:42
    #35852569
VBR
VBR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
Поправил Jdbf и все стало работать ок.
Во вложении все необходимое.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
07.07.2016, 19:47:26
    #39270133
user-visio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
VBR,
у меня с буквой Ш такая же проблема
str_con:=Convert(val_str2,'RU8PC866','CL8MSWIN1251');
и что делать?
временно заменил Ш на ш
...
Рейтинг: 0 / 0
07.07.2016, 20:25:58
    #39270145
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
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
08.07.2016, 08:04:43
    #39270259
user-visio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
VBR,
у меня с буквой Ш такая же проблема
str_con:=Convert(val_str2,'RU8PC866','CL8MSWIN1251');
и что делать?
временно заменил Ш на ш
...
Рейтинг: 0 / 0
08.07.2016, 08:07:45
    #39270262
user-visio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание DBF из пакета Oracle
и конкретно что делать?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / создание DBF из пакета Oracle / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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