¿Cómo ha podido recuperar la columna con nombre de parámetro fila de forma dinámica en Oracle PL / SQL?

StackOverflow https://stackoverflow.com/questions/1289651

  •  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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top