获取 SQL 列的值并将其用作列名
Get value of SQL column and use it as column name
是否可以从列中获取值并将其用作列名。
CREATE OR REPLACE PROCEDURE INSERT_INTO_MODELLBAU IS
BEGIN
MERGE INTO modellbau k
USING (
SELECT jahr,
**monat**
FROM modell)
m
ON (k.jahr = m.jahr)
WHEN MATCHED THEN
UPDATE SET k."monat" = m.menge
WHEN NOT MATCHED THEN
INSERT (jahr, valueOf('monat')) <---
VALUES (m.jahr, m.menge);
end;
我的目标是从 'monat' 中获取值并将其用作更新语句中的列名。 'monat' 列存储列名。
将可能的列列入白名单并使用 CASE
语句:
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;
/
此外,您(通常) 在一个过程中,相反,应该 COMMIT
来自调用该过程的语句,因为它允许您将多个过程链接在一起并且 COMMIT
或 ROLLBACK
作为一个块而不是单独的。
是否可以从列中获取值并将其用作列名。
CREATE OR REPLACE PROCEDURE INSERT_INTO_MODELLBAU IS
BEGIN
MERGE INTO modellbau k
USING (
SELECT jahr,
**monat**
FROM modell)
m
ON (k.jahr = m.jahr)
WHEN MATCHED THEN
UPDATE SET k."monat" = m.menge
WHEN NOT MATCHED THEN
INSERT (jahr, valueOf('monat')) <---
VALUES (m.jahr, m.menge);
end;
我的目标是从 'monat' 中获取值并将其用作更新语句中的列名。 'monat' 列存储列名。
将可能的列列入白名单并使用 CASE
语句:
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;
/
此外,您(通常)COMMIT
来自调用该过程的语句,因为它允许您将多个过程链接在一起并且 COMMIT
或 ROLLBACK
作为一个块而不是单独的。