Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/75: Рейтинг темы: голосов - 75, средняя оценка - 4.67
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416

Заполнение данными таблиц

21.04.2017, 22:08. Показов 14567. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть несколько таблиц, которые имеют первичные, вторичные ключи и прочие данные. Необходимо написать скрипт (вероятно функцию с входными параметрами), которая добавляла бы данные во все таблицы. То есть на вход ей должны подаваться все поля всех таблиц.
Важно учитывать, что не все параметры функции могут быть использованы.
То есть: например, у нас есть две таблицы: Водитель и Штрафы.
Мы дублируем все поля обеих таблиц в параметры функции.
НО, ведь не у каждого водителя может быть штраф, следовательно, для какого-то из водителей мы не должны вбивать данные в таблицу Штрафы.
Как это можно реализовать?

Oracle 11 SQL
1
2
3
4
CREATE TABLE driver(
id_driver INT NOT NULL PRIMARY KEY,
FIO VARCHAR(150) NOT NULL
);
Oracle 11 SQL
1
2
3
4
CREATE TABLE penalty(
id_penalty INT NOT NULL PRIMARY KEY,
amount INT NOT NULL
);
Мои мысли:

Oracle 11 SQL
1
2
3
4
5
6
7
8
CREATE FUNCTION add_data(
id_dri INT, FIO_dri VARCHAR(150), id_penal INT, amoun INT
)
 
RETURNS --(что возвращает?)
AS $$
--что в теле функции?
$$ LANGUAGE SQL;
Как вызвать данную функцию?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2017, 22:08
Ответы с готовыми решениями:

Быстрое заполнение данными
имеется 3 связанные таблицы: тест, студент, оценка по тесту необходимо заполнить таблицу оценок так, чтобы каждый студент имел оценку по...

Заполнение таблицы данными
Добрый день! Имеется база данных "Рыболовная база". Нужно через форму заполнить таблицу "Клиенты". Как это можно осуществить без...

Заполнение таблицы данными
Здравствуйте. Подскажите, пожалуйста, как можно заполнить таблицу такого типа: У меня есть таблица ПЕРЕПЛЕТ в ней столбцы ТИП и ФОРМАТ, мне...

6
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
22.04.2017, 00:11
хорошая идея - сделать по одной элементарной функции для каждой таблицы.
при этом уникальные идентификаторы сделать out-параметрами, которые будут возвращаться из функции после вставки.
и уже в add_data можно сделать какую-то более сложную логику.
когда штраф не нужен, значение его параметра можно присвоить null, проверять этот null и, соответственно, не вызывать элементарную функцию вставки штрафа.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2017, 01:30  [ТС]
grgdvo, честно сказать, я не понял как это реализовать
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
23.04.2017, 05:51
Лучший ответ Сообщение было отмечено Alex7676 как решение

Решение

например так.

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
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
DROP TABLE IF EXISTS penalty;
DROP TABLE IF EXISTS driver;
 
CREATE TABLE driver(
id_driver INT NOT NULL PRIMARY KEY,
FIO VARCHAR(150) NOT NULL
);
 
CREATE TABLE penalty(
id_penalty INT NOT NULL PRIMARY KEY,
amount INT NOT NULL,
id_driver INT,
CONSTRAINT fk_driver FOREIGN KEY (id_driver) REFERENCES driver(id_driver)
);
 
CREATE OR REPLACE FUNCTION add_driver(_id IN INTEGER, _fio IN VARCHAR(50)) RETURNS INTEGER AS
$$
BEGIN
  IF _id IS NULL THEN
     -- sequence should be used instead
    SELECT MAX(id_driver) + 1 INTO _id FROM driver;
    IF _id IS NULL THEN
      _id := 1;
    END IF;
  END IF;
  INSERT INTO driver(id_driver, FIO) VALUES (_id, _fio);
  RETURN _id;
END;
$$
LANGUAGE plpgsql;
 
CREATE OR REPLACE FUNCTION add_penalty(_id IN INTEGER, _amount IN INTEGER, _driver IN INTEGER) RETURNS INTEGER AS
$$
BEGIN
  IF _id IS NULL THEN
     -- sequence should be used instead
    SELECT MAX(id_penalty) + 1 INTO _id FROM penalty;
    IF _id IS NULL THEN
      _id := 1;
    END IF;
  END IF;
  INSERT INTO penalty(id_penalty, amount, id_driver) VALUES (_id, _amount, _driver);
  RETURN _id;
END;
$$
LANGUAGE plpgsql;
 
CREATE OR REPLACE FUNCTION add_data(id_dri IN INT, FIO_dri VARCHAR(150), id_penal IN INT, amount INT, dout OUT INTEGER, pout OUT INTEGER) AS
$$
BEGIN
  SELECT add_driver(id_dri, FIO_dri) INTO dout;
  IF amount IS NOT NULL THEN
    SELECT add_penalty(id_penal, amount, dout) INTO pout;
  END IF;  
END;
$$ LANGUAGE PLPGSQL;
Когда речь идет о том, что штраф назначается водителю, значит эти таблицы должны быть связаны. Поле id_driver в таблице penalty содержит идентификатор водителя, которому назначен штраф.
1
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
24.04.2017, 00:17  [ТС]
grgdvo, разобрал ваш код. Спасибо за него
Идею, кажется, я понял.
Надо в итоге вызывать только функцию add_data с входными параметрами (dri, FIO_dri, id_penal, amount)?
Как вызвать такую функцию со вставкой?

Добавлено через 9 минут
Вернее, как правильно вызвать такую функцию со вставкой?
Вызвать получается так:
SQL
1
SELECT add_data(1, 'Petr', 1, 500)
но чтобы без SELECTa было, а просто выполнение функции?

Добавлено через 5 минут
Использование конструкции вида:
SQL
1
PERFORM add_data(1, 'Petr', 1, 500);
результатов не дало.

Добавлено через 36 минут
grgdvo, и как можно поступить, если Первичный Ключ является типом VARCHAR(50) (то есть строковым типом)? На что можно его изменять, если он на входе NULL?

Добавлено через 6 часов 16 минут
grgdvo, остался актуален только вопрос с PERFORM.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
24.04.2017, 02:20
Вызов функции тоже должен быть SQL-выражением, поэтому используйте SELECT для вызова функции.
Либо используйте PERFORM из plpgsql, но тогда через анонимный блок DO
SQL
1
2
3
DO $$
  PERFORM ....
$$
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
24.04.2017, 02:55  [ТС]
grgdvo, все понял. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2017, 02:55
Помогаю со студенческими работами здесь

Заполнение данными бд Клиенты
Есть две таблицы: Clients - со списком клиентов. (имя, телефон и т.п.) Orders - с заказами. Как сделать в таблице Orders внешний...

Заполнение БД случайными данными
Нужно заполнить БД данными, а вручную - муторное дело. Пытаюсь добавить таким скриптом данные (Хотелось бы, чтобы 1 преподавателю...

Триггер с данными из двух таблиц
Помогите, пожалуйста. БД в IBExpert. Нужно написать триггер для атрибута summ в таблице ord, т.е. чтобы сумма заказа вычислялась...

Отчет с данными из нескольких таблиц
Здравствуйте,подскажите,как брать данные из разных таблиц,у меня есть две таблицы по продуктам в первой цена и количество и наименование,а...

Форма с данными из нескольких таблиц
Здравствуйте! Необходимо создать форму, через которую можно будет вводит данных в несколько таблиц. Эти таблицы можно посмотреть во...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru