如何在 oracle pl/sql 查询中动态获取字段名称?

Posted

技术标签:

【中文标题】如何在 oracle pl/sql 查询中动态获取字段名称?【英文标题】:How to get field name dynamically in oracle pl/sql query? 【发布时间】:2014-06-03 11:58:23 【问题描述】:

我有一个表,其中包含名为“value1”、“value2”、“value3”的字段。 在 sql 代码中,我有一个 NUMBER 类型的变量 selectedValue,它在代码的循环内动态获取其值。我也有一个这样的简单查询:

SELECT value1 FROM val_table;

所以我想在 selectedValue = 1 时选择 value1,在 selectedValue = 2 时选择 value2,在 selectedValue = 3 时选择 value3。

如何根据 selectedValue 变量的值在 SELECT 语句中动态获取字段名称?

【问题讨论】:

请编辑您的问题并显示示例数据和您所指的代码。 【参考方案1】:

最简单的做法是:

DECLARE
  aNumber  NUMBER;
BEGIN
  CASE selectedValue
    WHEN 1 THEN SELECT VALUE1 INTO aNumber FROM VAL_TABLE;
    WHEN 2 THEN SELECT VALUE2 INTO aNumber FROM VAL_TABLE;
    WHEN 3 THEN SELECT VALUE3 INTO aNumber FROM VAL_TABLE;
  END CASE;

  DBMS_OUTPUT.PUT_LINE('aNumber=' || aNumber);
END;

如果您想让它更复杂,您可以执行以下操作:

DECLARE
  aCursor  SYS_REFCURSOR;
  strQuery VARCHAR2(1000);
  strField VARCHAR2(20);
  aNumber  NUMBER;
BEGIN
  CASE selectedValue
    WHEN 1 THEN strField := 'VALUE1';
    WHEN 2 THEN strField := 'VALUE2';
    WHEN 3 THEN strField := 'VALUE3';
  END CASE;

  strQuery := 'SELECT ' || strField || ' FROM VAL_TABLE';

  OPEN aCursor FOR strQuery;

  LOOP
    FETCH aCursor INTO aNumber;
    EXIT WHEN aCursor%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE('aNumber=' || aNumber);
  END LOOP;

  CLOSE aCursor;
END;

分享和享受。

【讨论】:

您也可以使用 DECODE() 函数代替 CASE 中的多个 WHEN ... THEN 语句 @denied - 我个人更喜欢CASE 而不是DECODE。 YMMV。

以上是关于如何在 oracle pl/sql 查询中动态获取字段名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

如何在 Oracle PL/SQL 中动态地从行参数中获取命名列?

如何在 sqlplus 中调试 Oracle 动态 sql?

PL/SQL:clob 字符串中的动态查询。如何打开游标?

构建一些动态查询选择并立即在 Oracle PL/SQL 中显示其输出

Oracle PL/SQL 动态更改变量值的问题