【问题标题】:Get value of SQL column and use it as column name获取 SQL 列的值并将其用作列名
【发布时间】:2021-07-19 19:53:04
【问题描述】:

是否可以从列中获取值并将其用作列名。

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' 列存储列名。

【问题讨论】:

  • 您需要使用动态 SQL(这需要一个 PL/SQL 块)。如果您编辑您的问题以包含可重现的测试用例 (stackoverflow.com/help/minimal-reproducible-example),我们可能会帮助您解决此问题。从你的伪 SQL 中准确猜出你想要发生的事情有点困难。
  • 你好@JustinCave,我编辑了我的答案。我希望你现在明白我的问题了。

标签: sql oracle stored-procedures


【解决方案1】:

将可能的列列入白名单并使用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;
/

此外,您(通常)should NOT put COMMIT statements 在一个过程中,而是应该从调用该过程的语句中 COMMIT,因为它允许您将多个过程链接在一起,COMMITROLLBACK 作为一个块而不是单独的。

【讨论】:

  • 感谢您的建议。在手动将所有列列入白名单并调用该过程后,我收到以下错误:“无法在源表中获得一组稳定的行”。你知道如何偶然解决这个问题吗?
  • @AmineLe,你在哪里得到那个错误?,在你的MERGE 声明中? - 如果是这样,请检查 SELECT 的值。您有重复的值,PLSQL 无法决定将UPDATE 应用于哪个值。使用dbfiddle.uk 创建示例。
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2019-09-26
相关资源
最近更新 更多