1

我有这样的程序:

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是一个无效的标识符,这让我相信执行立即是在其他一些上下文中运行的。

有可能做我上面想做的事情吗?

4

3 回答 3

1

你在 EXECUTE IMMEDIATE 中所做的应该在任何情况下都是可行的。你的例子不适合这个,因为它在你的程序之外是不可行的。

一种可能的解决方法 - 传递 ID 而不是整行并从表中选择该单列。尽管如果经常使用这可能会降低性能。

于 2009-08-17T20:55:28.913 回答
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 事件中生成它。它可能不漂亮,但它会起作用。

于 2009-08-17T22:47:23.367 回答
1

我认为您尝试做的事情是不可能的。立即执行命令是动态 SQL 执行。创建“foo”过程时不解析 sql 语句,而是在运行时解析。对于 oracle,它是“选择 p_record”。|| p_field_name || 'from dual' 是一个 varchar,p_record 也是。所以这解释了为什么你有这个错误。解决方案是编写类似 if/elsif/... 或 case/when 的内容。

于 2009-08-18T14:57:14.057 回答