获取 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 来自调用该过程的语句,因为它允许您将多个过程链接在一起并且 COMMITROLLBACK 作为一个块而不是单独的。