powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / HELP! процедура сравнения таблиц
17 сообщений из 17, страница 1 из 1
HELP! процедура сравнения таблиц
    #39314140
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем! Я не сильна в pl/sql, так что нужна помощь. Надо создать процедуру, при запуске которой будут сверятся 2 таблички, если не совпадают данные, то будет происходить update или insert. Я сделала одну версию с MERGE, но там я не могу пометить проапдейчиные записи.
Вот второй вариант, но update не работает. Может кто-нибудь посоветовать что-то?
CREATE OR REPLACE PROCEDURE check_firm IS
v_gt firm_mdm%ROWTYPE;
BEGIN
FOR b IN (SELECT mdm_id,
s_firm_name_rus,
f_firm_name_rus,
f_firm_name_eng,
inn,
kpp,
archiv
FROM firm
WHERE NOT EXISTS (SELECT * FROM firm_mdm WHERE firm_mdm.mdm_id = firm.mdm_id))
LOOP
INSERT INTO firm_mdm
(mdm_id, s_firm_name_rus, s_firm_name_eng, f_firm_name_rus, inn, kpp, archiv, time_stamp, created)
VALUES
(b.mdm_id, b.s_firm_name_rus, b.f_firm_name_rus, b.f_firm_name_eng, b.inn, b.kpp, b.archiv, SYSDATE, 1);
END LOOP;
FOR c IN (SELECT * FROM firm)
LOOP
IF firm.s_firm_name_rus <> firm_mdm_gt.s_firm_name_rus THEN

UPDATE firm_mdm
SET firm_mdm.s_firm_name_rus = firm.s_firm_name_rus,
firm_mdm.time_stamp = SYSDATE,
firm_mdm.created = 1;
END IF;
END LOOP;
END;
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314167
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99Может кто-нибудь посоветовать что-то?
для начала тег SRC.
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99там я не могу пометить проапдейчиные записи.

Что мешает?

Gvenvivar99Может кто-нибудь посоветовать что-то?
Заменить "не могу" на "пробовала вот это, получилось вот это вместо того-то".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314204
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
дело в том ,что на входе нет параметров у процедуры.
Поэтому, при update выходит ошибка
ORA-01422: Точная выборка возвращает количество строк больше запрошенного
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314206
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. при условии if она сравнивает с множеством, я так понимаю.
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314239
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99дело в том ,что на входе нет параметров у процедуры.
Поэтому, при update выходит ошибка
ORA-01422: Точная выборка возвращает количество строк больше запрошенного

Отсутствие параметров никак не влияет на криво написанный запрос. Рихтуй руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314251
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99при update выходит ошибка
ORA-01422: Точная выборка возвращает количество строк больше запрошенного
Не совсем.
Приведенный текст синтаксически некорректен, поэтому ошибка будет при компиляции и совсем другая.
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314277
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous, дак я и написала, чтоб указали на ошибку. Самой найти не получается
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314292
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99, вот этот блок - одна сложносочиненная ошибка.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	FOR c IN (SELECT * FROM firm)
	LOOP
		IF firm.s_firm_name_rus <> firm_mdm_gt.s_firm_name_rus THEN

			UPDATE firm_mdm
			   SET firm_mdm.s_firm_name_rus = firm.s_firm_name_rus
				 , firm_mdm.time_stamp = SYSDATE
				 , firm_mdm.created = 1
			;
		END IF;
	END LOOP;
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314310
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gvenvivar99Я сделала одну версию с MERGE, но там я не могу пометить проапдейчиные записи.


Выкинь процедуру и покажи свой MERGE. Как я понимаю ты хочешь добавить в firm_mdm недостающие записи а в существующих обновить s_firm_name_rus. Если да, то ON (firm_mdm.mdm_id = firm.mdm_id) а в WHEN MATCHED иcпользуй UPDATE c WHERE firm.s_firm_name_rus <> firm_mdm.s_firm_name_rus.

SY.
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314314
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
FOR c IN (SELECT * FROM firm)
LOOP
SELECT * INTO v_gt FROM firm_mdm;
IF c.s_firm_name_rus <> v_gt.s_firm_name_rus THEN
UPDATE firm_mdm
SET firm_mdm.s_firm_name_rus = c.s_firm_name_rus,
firm_mdm.time_stamp = SYSDATE,
firm_mdm.created = 1
WHERE v_gt.mdm_id = c.mdm_id;
END IF;
END LOOP;

где v_gt firm_mdm%ROWTYPE;
но и так не работает.
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314337
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
мне надо не по одному полю, там в примере просто только одно. Необходимо пометить измененные записи по любому полю

CREATE OR REPLACE PROCEDURE load_contractor_equeue(res OUT NUMBER) IS l_count NUMBER;

l_count_new NUMBER;

l_count_new2 NUMBER;

BEGIN
res := 0;
SELECT COUNT(firm.mdm_id) INTO l_count FROM firm;
MERGE INTO firm_mdm p
USING (SELECT mdm_id,
s_firm_name_rus,
f_firm_name_rus,
f_firm_name_eng ,
inn,
kpp,
archiv
FROM firm) p1
ON (p.mdm_id = p1.mdm_id)
WHEN MATCHED THEN
UPDATE
SET p.s_firm_name_rus = p1.s_firm_name_rus,
p.s_firm_name_eng = p1.f_firm_name_eng,
p.f_firm_name_rus = p1.f_firm_name_rus,
p.inn = p1.inn,
p.kpp = p1.kpp,
p.archiv = p1.archiv,
p.time_stamp = sysdate,
p.created = '1'
where p.s_firm_name_rus <> p1.s_firm_name_rus or
p.f_firm_name_rus <> p1.f_firm_name_rus or
p.inn <> p1.inn or
p.kpp <> p1.kpp or
p.archiv <> p1.archiv
WHEN NOT MATCHED THEN
INSERT
(p.mdm_id, p.s_firm_name_rus, p.f_firm_name_rus, p.inn, p.kpp, p.archiv,p.time_stamp,p.created)
VALUES
(p1.mdm_id, p1.s_firm_name_rus, p1.f_firm_name_rus, p1.inn, p1.kpp, p1.archiv, sysdate, '1');
SELECT COUNT(firm_mdm.mdm_id) INTO l_count_new FROM firm_mdm;
IF l_count = l_count_new THEN
res := 1;
dbms_output.put_line('MERGE выполнен успешно,кол-во строк FIRM_MDM=' || l_count_new ||
', кол-во строк FIRM_MDM= ' || l_count);
ELSE
dbms_output.put_line('MERGE не выполнен');
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
COMMIT;
END load_contractor_equeue;
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314341
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gvenvivar99,
Код: plsql
1.
SELECT *  FROM firm_mdm;



Вернет тебе много много строк, и ты пытаешься эти много строк запихать в переменную, предназначенную для одной строки
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314343
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бельфя, да, я понимаю. Просто не могу придумать, как это сделать иначе
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314364
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а использовать DBMS_COMPARISSON?
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314403
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gvenvivar99,

А что не так с мержем?
...
Рейтинг: 0 / 0
HELP! процедура сравнения таблиц
    #39314436
Gvenvivar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, блин, спасибо! С MERGE и where все работает! Я даже не знаю, почему не пробовала его раньше добавлять. Не так часто (очень редко) MERGE использую.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / HELP! процедура сравнения таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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