我有一个这样的过程:

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应该是在任何情况下是可行的。例如你不适合这个,因为它不会是可行的程序之外。

一个可能的解决方法 - 通过代替全行ID,并选择从表单个列。虽然如果使用通常这可以杀死性能。

其他提示

这有什么错一个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。它可能不漂亮,但它会工作。

我知道你在试图做是不可能的。 立即执行订单是动态SQL执行。当您创建“富”过程的SQL statment不会被解析,但在运行时。 对于Oracle是“选择p_record。” || p_field_name || “从双反”是一个varchar和p_record了。因此,这也解释了为什么你有这样的错误。 解决的办法是写类似如果/ ELSIF / ...或壳体/时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top