powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA6. Заполнение данными из внешнего файла
14 сообщений из 14, страница 1 из 1
ASA6. Заполнение данными из внешнего файла
    #32452928
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.

Возникла следующая задача:

Есть база на ASA 6.04
В базе есть таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
create table TabData
(indx integer not null,
field1 integer,
....
fieldN varchar( 20 ),
primary key (indx)
)


В файле формата ASCII file1.txt находятся данные, по структуре в точности совпадающие со структурой этой таблицы (данные выгружены из другой базы с такой же структурой).

Нужно залить данные из файла в таблицу, но не все подряд, а с проверкой опред. условий (например, при совпадении ключа пропустить эту одну запись, но залить все остальные).

У меня была идея реализовать это путем временной таблицы с такими же полями, как и TabData. Залить данные в эту временную таблицу, ну а дальше уже все просто.

Теперь, собственно, проблема:
Все упирается в то, каким образом можно с пом. sql-команд создать таблицу со структурой, аналогичной существующей.
Писать каждый раз create table (или declare temporary table) со структурой таблицы не есть хорошее решение, т.к. таблиц и файлов много, и структуры у всех разные.

Вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin
select * from TabData
into #TempTab
where indx =  0 ;  ---- пустая временная таблица со структурой как у TabData
 

load into #TempTab 
from 'file1.txt';
end


не проходит - выдается ошибка, что #TempTab не найдена.

Подскаджите, пожалуйста, как можно создать таблицу с копией заданной структуры или какие-то варианты другого решения поставленной задачи.

Заранее спасибо
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32452961
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if object_id ('MyPersistentTable') Is Not Null
begin
  drop table MyPersistntTable
  if @@error <>  0  
    Exit
end

Select * From TabData
Into MyPersistentTable
Where  1  =  2  ;  ---- пустая временная таблица со структурой как у TabData
 

Load Into MyPersistentTable
from 'file1.txt';
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453051
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * into #TempTab from TabData where indx = 0
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453179
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Raven A
этой синтаксической ошибки в реальном скрипте нет, просто когда я набивала в форуме, то перепутала порядок операторов. Но все равно спасибо :)

to Алксандр Спелицин
попробовала Ваш вариант. Результат тот же самый.
Честно говоря, не понимаю разницы между Вашим и моим вариантами.
Ведь таблица-то ни в одном, ни в другом варианте на момент выполнения
select into... не существует. Она создается в обоих вариантах динамически. А от ее названия, по-моему, мало что меняется.
Или я что-то не понимаю?

Условия where indx = 0 и
where 1 = 2 , по-моему, тоже равнозначны, т.к. записей с indx = 0 в таблице нет и оба запроса возвращают пустой НД.

Ошибка возникает не при выполнении select into... , а при след. обращении к той таблице, куда был сделан select
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453230
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только что вычитала в Help'e, что в Load table.. нельзя использовать локальные временные таблицы. Так что вопрос теперь звучит так: как можно создать НЕ временную таблицу со структурой, как у другой сущ. таблицы (или какие-либо другие идеи решения описанной задачи).

Спасибо
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453713
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то у меня была похожая задачка... Не буду утверждать что мое решение самое простое... но оно работает :)
1) Все целевые таблицы (на данный момент пустые) выгружаются в формат dBaseIII
2) Запускается сам dBaseIII (впрочем можно использовать и клиппер и фокспро :), и средствами dBaseIII данные из ascii файла затягиваются в dbf'ы
use data1.dbf
append from data1.txt delimited ","
3) опять же средствами dBaseIII чистим данные с проверкой условия
delete for idx_fld<2 .and. idx_fld>10
pack
(Впрочем, можно эту операцию и пропустить и делать фильтрацию уже позже, средствами sql)
4) Загружаем в ASA базу уже отфильтрованные данные из data1.dbf

а потом загружать dbf'ки во временные таблицы через команду isql - input. она в отличие от load умеет загружать данные во временные таблицы. А структуру этой временной таблицы она возьмет из заголовка dbf файла.
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453754
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за идею.
Если честно, то не совсем понятен первый пункт реализации:
каким образом выгружается структура таблиц в формат Dbase?

Unload Table в ASA 6 поддерживает только выгрузку в ASCII. А Вы как выгружали?
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453768
Фотография DenisVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну выгружать данные можно и при помощи OUTPUT TO см help :-))
SELECT *

FROM employee ;
OUTPUT TO employee.txt
FORMAT DBASEIII
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453774
Фотография DenisVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я конечно по поводу данных...
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453795
Фотография DenisVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по поводу твоего вопроса, создаешь хранимую, в которую передаешь имя таблицы, владельца, имя как хочешь чтобы называлась, ищещь в системных таблицах sys.systable, sys.syscolumn,sys.sysdomain и т.п.(данные по таблицы), создаешь строку на основании полученных данных типа
set sql='create table tt(dd integer)';
execute immediate sql;
ну а дальше простой инсерт...
типа

set sql='insert into tt from TabData where indx = 0';
execute immediate sql;

Сама понимаешь это только пример...
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32453933
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkniUnload Table в ASA 6 поддерживает только выгрузку в ASCII. А Вы как выгружали?
Вся работа делается черз dbisql и его команды INPUT/OUTPUT.
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32454023
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая штука - ErWin называется. Натравливаешь ее на БД (в том числе и на DBF) делаешь реинженеринг - получаешь описание таблиц. Можешь там кое что поправить. А потом сгенерить скрипт на создание таблиц в другой БД.
Или Borland DataBase Decstop (из Delphi или С билдера) позволяет копировать таблицы из одной БД (любой из списка ODBC) в другую (любую из списка ODBC). Причем при копировании структуру создает сам (иногда кривую) на основе исходной таблицы. Проблемы возникали, только если таблицы содержали экзотические типы данных.
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32454253
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to DenisVK
Output... format dBaseIII это конечно хорошо, и help я тоже иногда читаю, особенно перед тем, как свои проблемы на другую голову сваливать :)
Но воспользоваться Output-ом я в данном случае не могу, т.к. данные выгружаются из нескольких таблиц в несколько файлов в одной хранимой процедуре по куче условий, а в батчах, процедурах и ф-циях использование этой команды, увы, не разрешается.

А по поводу динамического создания таблиц из системных - идея хорошая, может в жизни пригодиться. Опробую.

to golsa
он копирует таблицы вместе с данными или можно только структуру копировать и таблице в другой базе другое имя дать?
...
Рейтинг: 0 / 0
ASA6. Заполнение данными из внешнего файла
    #32454833
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воспользовавшись советом DenisVK, получилась такая процедура, которая создает новую пустую таблицу со структурой заданной (может, еще кому-то пригодится):

Код: 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.
alter procedure spCreateTableCopy(in @NewTableName varchar( 20 ), in @ExistTableName varchar ( 20 ))
 --- @NewTableName - имя новой таблицы (копии)
 
 --- @ExistTableName - имя таблицы - оригинала
 
begin
  declare @TableDef  varchar( 4000 );  --- строка-скрипт создания таблицы
 
  declare @PKDef varchar( 100 );   --- опред. ПК
 

   --- если таблица-копия уже существует, удалить ее
 
  if exists(select  1  from systable where table_name = @NewTableName) then
    execute immediate 'drop table ' || @NewTableName;
  end if;

  set @TableDef = 'create table ' || @NewTableName || ' (';
  set @PKDef = '';

  FOR ColDefs AS Curs CURSOR FOR
     --- этот select возвращает структуру заданной таблицы
 
    select c.column_id, c.column_name, c.pkey, d.domain_name, 
	(case d.domain_id
		when  7  then '(' || C.width || ')'    ---- Char (N)
 
		when  8  then '(' || C.width || ')'    ---- Char (N)
 
		when  9  then '(' || C.width || ')'    ----- Varchar (N)
 
		when  3  then '(' || C.width || ', ' || C.scale ||')'	  ------ Numeric (X,Y)
 
		else ''
	end) as precision1,
	(if c.nulls = 'N' then 'NOT NULL' else '' endif) as NullsAllowed,
	ifnull (c. "default" , '', 'Default ' || c. "default" ) as DefVal
    from syscolumn c inner join sysdomain d
    on d.domain_id=c.domain_id
    where c.table_id = (select table_id from systable where table_name= @ExistTableName)
    order by c.column_id 
  FOR READ ONLY
  DO
     ---- в цикле формируется строка - структура полей
 
    if column_id> 1  then 
         set @TableDef = string(@TableDef , ', ');
    end if;
    set @TableDef = @TableDef ||  string (column_name, ' ', domain_name, ' ', precision1, ' ', NullsAllowed , ' ' , DefVal);
     ---- определение первичного ключа
 
    if pkey = 'Y' then
        if @PKDef <> '' then
           set @PKDef = @PKDef || ', ';     
        end if;
        set @PKDef = @PKDef || column_name;
    end if;
  END FOR;

  if @PKDef <> '' then
    set @PKDef = ', Primary Key (' || @PKDef || ')';
  end if;
  set @TableDef = @TableDef || @PKDef || ')';

   --- создание таблицы
 
  execute immediate @TableDef;
end;


Некоторые моменты здесь не учтены (владелец таблицы, Check-constraints), т.к. для моей задачи это не актуально.

Если есть какие-то замечания по оптимизации этого кода, буду признательна.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA6. Заполнение данными из внешнего файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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