Whitelist the possible columns and use a CASE
statement:
CREATE OR REPLACE PROCEDURE INSERT_INTO_MODELLBAU IS
BEGIN
MERGE INTO al_modellbauk k
USING (
SELECT bereich,
jahr,
quelle,
einheit,
menge,
monat
FROM al_modellbau
) m
ON (k.jahr = m.jahr AND k.quelle = m.quelle)
WHEN MATCHED THEN
UPDATE
SET k.column1 = CASE m.monat WHEN 'COLUMN1' THEN m.menge ELSE k.column1 END,
k.column2 = CASE m.monat WHEN 'COLUMN2' THEN m.menge ELSE k.column2 END,
k.column3 = CASE m.monat WHEN 'COLUMN3' THEN m.menge ELSE k.column3 END
WHEN NOT MATCHED THEN
INSERT (
bereich,
jahr,
quelle,
einheit,
column1,
column2,
column3
)
VALUES (
m.bereich,
m.jahr,
m.quelle,
m.einheit,
CASE m.monat WHEN 'COLUMN1' THEN m.menge ELSE NULL END,
CASE m.monat WHEN 'COLUMN2' THEN m.menge ELSE NULL END,
CASE m.monat WHEN 'COLUMN3' THEN m.menge ELSE NULL END
);
end;
/
Also, you (typically) should NOT put COMMIT
statements in a procedure and, instead, should COMMIT
from the statement that calls the procedure as that allows you to chain multiple procedures together and COMMIT
or ROLLBACK
as a block rather than individually.