代码之家  ›  专栏  ›  技术社区  ›  Jamie Hale

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

  •  1
  • Jamie Hale  · 技术社区  · 17 年前

    我有这样的程序:

    PROCEDURE foo(
      p_field_name IN VARCHAR2,
      p_record IN table%rowtype )
    IS
      v_value VARCHAR2(100);
    BEGIN
      EXECUTE IMMEDIATE 'SELECT p_record.' || p_field_name || ' FROM dual' INTO v_value;
    END
    

    甲骨文抱怨说 p_record.my_field_name 是无效的标识符,这使我相信execute immediate正在其他上下文中运行。

    有没有可能做我想做的事?

    3 回复  |  直到 9 年前
        1
  •  1
  •   jva    17 年前

    您在ExecuteImmediate中所做的应该在任何上下文中都是可行的。您的示例不适合这个,因为它在您的过程之外是不可行的。

    一个可能的解决方法是传递ID而不是整行,然后从表中选择该单列。但如果经常使用,这可能会降低性能。

        2
  •  1
  •   Gary Myers    17 年前

    if/elsif有什么问题

    IF    p_field_name = 'COL1' THEN v_value := p_record.col1
    ELSIF p_field_name = 'COL2' THEN v_value := p_record.col2
    ...
    END IF;
    

    您可以通过从所有“选项卡”列中选择来生成它。它可能不漂亮,但会起作用。

        3
  •  1
  •   Pierre-Gilles Levallois    17 年前

    我认为你想做的是不可能的。 执行即时命令是动态SQL执行。在创建“foo”过程时,不会分析SQL语句,而是在运行时分析。 对于Oracle,它是“选择P_U记录”。_P_U字段名称来自Dual”是varchar,P_U记录也是。这就解释了为什么会出现这个错误。 解决方案是编写类似于if/elsif/…的内容。或情况/时间。