я следующие данные в качестве коллекции объектов col_a:обновления столбцов путем группирования операций
00004719~BBK~US
00004719~SBK~US
00004719~OBK~GB
00004719~IBK~DE
00004720~BBK~US
00004720~SBK~GB
00004725~IBK~IN
col_a определяется в базе данных:
create OR REPLACE TYPE col_a AS TABLE OF varchar2(100)
У меня есть требование, чтобы обновить 4 колонки в upd_tbl (col_bbk, col_sbk, col_ibk, col_obk) из приведенных выше данных, так что: , если col_a содержит BBK, затем обновляет col_bbk с третьим значением разделителя ~ для транзакции; Если col_a содержит SBK, обновите col_sbk аналогично для транзакции. Номер транзакции идентифицируется первой встречей ~ подстроки в col_a.
transaction_number - pk в upd_tbl, и между upd_tbl и данными коллекции есть один-ко-многим. Но коллекция имеет номер транзакции как часть ее элемента.
transaction_number = regexp_substr(col_a, '[^~]+', 1, 1)
Выход необходимо: Для операции '00004719', col_bbk = US, col_SBK = US, col_obk = GB, col_ibk = DE.
В настоящее время я обрабатываю его путем пошагового обновления отдельных значений col_a в цикле. По существу, для той же транзакции «00004719» обновление запускается 4 раза на основе кода (SBK и т. Д.).
Можно ли записать это обновление за одну транзакцию за один снимок?
Нижеследующее содержит ошибки в «команде sql, которая не была должным образом закончена».
UPDATE upd_tbl
SET ctry_bbk = (CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'BBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END),
ctry_sbk = CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'SBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END,
ctry_ibk = CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'IBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END,
ctry_obk = (CASE
WHEN regexp_substr(tam.column_value, '[^~]+', 1, 2) = 'OBK' THEN regexp_substr(tam.column_value, '[^~]+', 1, 3)
ELSE NULL
END)
from (select column_value from table(col_a('00004719~BBK~US','00004719~SBK~US','00004719~IBK~GB','00004719~OBK~IN','00004720~BBK~US','00004720~SBK~RU','00004725~BBK~US'))) tam
where upd_tbl.transaction_number = regexp_substr(tam.column_value, '[^~]+', 1, 1);
Спасибо. Но что, если значения col_a находятся в типе коллекции объектов? Я попробовал что-то вроде этого. Я не мог подгонять мое решение в комментариях. Итак, отредактировал вопрос. – Casey
проверьте его снова. Добавлено слияние с сводной таблицей. – paqogomez