如何动态地在甲骨文的PL / SQL获取来自行参数指定的列?
-
18-09-2019 - |
题
我有一个这样的过程:
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 / ...或壳体/时。
不隶属于 StackOverflow