|
|
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Добрый день всем! Я не сильна в 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 12:21 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99Может кто-нибудь посоветовать что-то? для начала тег SRC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 12:34 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99там я не могу пометить проапдейчиные записи. Что мешает? Gvenvivar99Может кто-нибудь посоветовать что-то? Заменить "не могу" на "пробовала вот это, получилось вот это вместо того-то". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:03 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, дело в том ,что на входе нет параметров у процедуры. Поэтому, при update выходит ошибка ORA-01422: Точная выборка возвращает количество строк больше запрошенного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:08 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Т.е. при условии if она сравнивает с множеством, я так понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:09 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99дело в том ,что на входе нет параметров у процедуры. Поэтому, при update выходит ошибка ORA-01422: Точная выборка возвращает количество строк больше запрошенного Отсутствие параметров никак не влияет на криво написанный запрос. Рихтуй руки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:30 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99при update выходит ошибка ORA-01422: Точная выборка возвращает количество строк больше запрошенного Не совсем. Приведенный текст синтаксически некорректен, поэтому ошибка будет при компиляции и совсем другая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:42 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, дак я и написала, чтоб указали на ошибку. Самой найти не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 13:58 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99, вот этот блок - одна сложносочиненная ошибка. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:06 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:19 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
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; но и так не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:20 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:38 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99, Код: plsql 1. Вернет тебе много много строк, и ты пытаешься эти много строк запихать в переменную, предназначенную для одной строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:38 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Бельфя, да, я понимаю. Просто не могу придумать, как это сделать иначе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:40 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
а использовать DBMS_COMPARISSON? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 14:53 |
|
||
|
HELP! процедура сравнения таблиц
|
|||
|---|---|---|---|
|
#18+
Gvenvivar99, А что не так с мержем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2016, 15:17 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39314436&tid=1887397]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
178ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 477ms |

| 0 / 0 |
