¿Cómo ha podido recuperar la columna con nombre de parámetro fila de forma dinámica en Oracle PL / SQL?
-
18-09-2019 - |
Pregunta
Tengo un procedimiento como este:
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 se queja de que p_record.my_field_name
es un identificador válido, lo que me lleva a creer que los derechos de ejecución inmediata se está ejecutando en otro contexto.
¿Es posible hacer lo que estoy tratando de hacer más arriba?
Solución
Lo que en EXECUTE IMMEDIATE debe ser factible en cualquier contexto. Usted ejemplo no se ajusta a esto, ya que no sería factible fuera de su procedimiento.
Una posible solución - ID en lugar de pasar a la fila completa y seleccionar esa sola columna de la tabla. Aunque esto podría matar el rendimiento si se utiliza a menudo.
Otros consejos
¿Qué hay de malo con un SI / 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;
Se puede generar eventos que a partir de un SELECT de ALL_TAB_COLUMNS. Puede que no sea bonita, pero que iba a funcionar.
Creo que lo que intenta hacer es imposible. Ejecutan las órdenes inmediatas son ejecuciones de SQL dinámico. La DECLARACIÓN SQL no se analiza cuando se crea procedimiento de "foo", pero en tiempo de ejecución. Para Oracle es 'seleccionar p_record.' || p_field_name || 'De la doble' es un varchar, y p_record también. Así que esto explica por qué tiene este error. La solución es escribir algo así como si / elsif / ... o caja / cuándo.