我有一个这样的程序:
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正在其他一些环境中运行。
是否可以做我上面尝试做的事情?
答案 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。