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

时间:2009-08-17 18:37:24

标签: oracle plsql dynamic-sql

我有一个这样的程序:

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

Oracle抱怨p_record.my_field_name是一个无效的标识符,这让我相信execute immediate正在其他一些环境中运行。

是否可以做我上面尝试做的事情?

3 个答案:

答案 0 :(得分:1)

在EXECUTE IMMEDIATE中执行的操作应该可以在任何上下文中使用。你的例子不合适,因为在你的程序之外它是不可行的。

一种可能的解决方法 - 传递ID而不是完整行,并从表中选择该单个列。虽然如果经常使用,这可能会破坏性能。

答案 1 :(得分:1)

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;

您可以从ALL_TAB_COLUMNS的SELECT生成事件。它可能不漂亮,但它会起作用。

答案 2 :(得分:1)

我认为你要做的事情是不可能的。 执行立即订单是动态SQL执行。创建“foo”过程时,不会在运行时解析sql语句。 对于oracle,它是'select p_record'。 || p_field_name || 'from dual'是一个varchar,也是p_record。这就解释了为什么你有这个错误。 解决方案是写if / elsif / ...或case / when。