Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
west_nester

Перегнать данные из любого файла с разделителями в таблицу базы данных (без повторов)

24.11.2012, 22:44. Показов 2940. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. В университете дали задание по sql. СУБД Oracle.

Необходимо перегнать данные из любого файла с разделителями в таблицу базы данных. Я это научился делать средствами sql loader-a. Но нужно не просто перегнать, а также написать запрос, чтобы исключить строки с повторяющимся значением. С этим то и проблема. Нужна консультация либо платное выполнение задания. Думаю, рублей 300 - нормальная цена, т.к. для специалиста - ничего сложного.

Итак, суть в слудеющем:

Есть таблица Users. В этой таблице поле id формируется с помощью последовательности.

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE SEQUENCE userid_generator START WITH 1;
 
CREATE TABLE users
(
id NUMBER(10) CONSTRAINT PK_users PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
ROLE VARCHAR2(10) NOT NULL,
login VARCHAR2(10) NOT NULL,
password VARCHAR2(10) NOT NULL,
email VARCHAR2(10)NOT NULL
)
/
 
 
CREATE OR REPLACE TRIGGER users_gen_pk_id
before INSERT
ON users
FOR each ROW
BEGIN
SELECT userid_generator.NEXTVAL INTO :NEW.id FROM dual;
END;
/
Задача:
Из файла с разделителями, в котором содержатся данные о пользователях сделать автоматическую запись этих данных в таблицу users. Автоматическая - это автообновление
таблицы через какой-то промежуток времени. Сделать нужно всё внутренними средствами Oracle.

Чего я пока достиг: научился с помощью Sqlloader-a перегонять данные из файла .dat в какую-нибудь таблицу. Потом запускаю bat файл, который вызывает sqlldr.

В моем файле .dat записи содержатся в следующем виде:
Susan,admin,admin,admin,susan@ru,
David,manager,dave21,dave21,dav@em,
Jill,manager,jillie,jillie,jil@il.ru,
Victoria,user,vicki,vicki,i@gmai,
Donald,user,dondon,dondon,dmai@u,
Huenald,user,dondon,dondon,dmai@u,
Hueria,user,vicki,vicki,i@gmai,

Проблема в следующем:
мне нужно, чтобы данные в таблицу users добавлялись с учетом email-a, указанного в dat-файле. Тоесть если изначально в нём две строки с одинаковым email, то
информация в полях name, role,login,password в таблице должна соответствовать последней строке dat-файла.
Если в dat-файл добавляется строка с новым email-ом, то эта строка должна быть добавлена в таблицу users. А если не с новым, то информация
в полях name, role,login,password в таблице в таблице должна обновиться.

Как я представляю решение: необходимо создать временную таблицу, в неё перегнать все данные из .dat файла (это я могу сделать), далее написать sql-запрос на обновление
таблицы users данными из временной таблицы с учетом email-a (основная проблема). Далее в bat файле прописать создание и удаление этой временно таблицы, вызов sql loader-a и далее вызов
файла с sql запросом. И организовать автоматический вызов bat файла средствами windows.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2012, 22:44
Ответы с готовыми решениями:

Вытащить данные из базы данных в таблицу
Здравствуйте! Подскажите пожалуйста как вытащить данные из БД в мою таблицу. Лично я никак не представляю себе как это сделать. ...

Выбирать из базы без повторов за сессию
Добрый день, написал небольшой движок для проекта, но есть одна проблема... Зашедший пользователь, или авторизированный может рандомно...

INSERT INTO не заносятся данные в таблицу базы данных
Помогите пожалуста разобратся. Почему у меня не заносятся данные в таблицу БД mySQL В Файле Politica.php <form...

1
14 / 14 / 0
Регистрация: 25.10.2012
Сообщений: 44
26.11.2012, 12:31
Не стоит создавать триггер, только для того, чтобы записывать в таблицу следующее значение последовательности.
В процедуре сразу можно сделать так:
insert into users values(userid_generator.nextval,'1','1', '1','1','1');

Из вашего сообщения не совсем понятно, когда нужно вставлять строку, а когда апдейтить уже существующую.

Добавлено через 48 минут
Если я правильно понял, то можно вот так сделать:
Oracle 11 SQL
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
DECLARE i NUMBER := 0;
 
BEGIN
FOR aaa IN
   (SELECT 'Susan' AS name,'admin' AS ROLE,'admin' AS login,'admin' AS passwo,'susan@ru' AS email FROM dual
    UNION ALL
   SELECT 'David','manager','dave21','dave21','dav@em' FROM dual
    UNION ALL
   SELECT 'Jill','manager','jillie','jillie','jil@il.ru' FROM dual
    UNION ALL
   SELECT 'Victoria','user','vicki','vicki','i@gmai' FROM dual
    UNION ALL
   SELECT 'Donald','user','dondon','dondon','dmai@u' FROM dual
    UNION ALL
   SELECT 'Huenald','user','dondon','dondon','dmai@u' FROM dual
    UNION ALL
   SELECT 'Hueria','user','vicki','vicki','i@gmai' FROM dual)
LOOP
   SELECT COUNT(*) INTO i FROM users a WHERE a.email = aaa.email;
--если в таблице есть нет такого майла, то добавляем строку
IF i = 0 THEN
    INSERT INTO users VALUES (userid_generator.NEXTVAL,aaa.name,aaa.ROLE, aaa.login, aaa.passwo, aaa.email);
   ELSE   --если в таблице есть такой майл, то обновляем строку
   UPDATE users u SET u.name = aaa.name,u.ROLE = aaa.ROLE, u.login = aaa.login, u.password = aaa.passwo
   WHERE u.email = aaa.email;
END IF;
END LOOP
COMMIT;
END;
это может быть куском процедуры, здесь идет цикл по данным, которые заливаем (это может быть цикл по строкам файла).
Если решите сделать временную таблицу и залить в нее данные, то цикл не понадобится, тут хватит команды MERGE.

Добавлено через 4 часа 14 минут
Вариант, который предложил автор сообщения: закинуть данные из файла во временную таблицу.
Допустим, у вас есть таблица users_temp - это та таблица, в которую вы закинули данные из файла.
users_temp имеет туже самую структуру, что и users, только столбец id здесь будет номером строки из файла,
это необходимо, чтобы обработать строки с одинаковым email и взять ту, у которой порядковый номер больше.
Вот пример с MERGE:

Oracle 11 SQL
1
2
3
4
5
6
merge INTO users a
USING (SELECT  name, ROLE, login, password, email FROM users_temp WHERE id IN (SELECT MAX(id) FROM users_temp GROUP BY email)) b ON (a.email = b.email)
WHEN matched THEN
UPDATE SET a.name = b.name, a.ROLE = b.ROLE, a.login = b.login, a.password = b.password
WHEN NOT matched THEN
INSERT VALUES(userid_generator.NEXTVAL, b.name, b.ROLE, b.login, b.password, b.email)
После этого чистим users_temp. Обращаю внимание, что users_temp временная таблица не в терминах ORACLE, это обычная таблица.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2012, 12:31
Помогаю со студенческими работами здесь

Не могу вывести данные из базы данных в таблицу
У меня почему-то много ошибок выводит такие как nullpointerexception Вот код package sample; import java.net.URL; import...

Добавить в таблицу Базы Данных данные из таблицы DataSet
Нужна ваш помощь. Пытаюсь добавить в таблицу базы данных все данные из DataSet.Table. Т.е. в таблицу DataSet.Table я загружаю данные из...

Заполнять таблицу (без повторов). Маленькая скорость
Как ускорить? В БД 2 таблицы temp, infos с 1 колонкой value. Добавляем в БД через функцию inspAdd(); 0 + 13.5кк = 135сек ...

Как добавить новые данные в таблицу базы данных через textBox?
Всем доброго времени суток! Подскажите как добавить новые данные в таблицу базы данных через textBox... ...

Возможно ли перегнать данные из текстового файла по ячейкам в Excel?
Возможно ли перегнать данные из TXT файла по ячейкам в Excel? Структура TXT - это по сути база данных фирм, выглядет она вот как: ~...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru