sql >> Base de Datos >  >> RDS >> Oracle

Insertar datos en la tabla usando Ejecutar inmediatamente en Oracle

Puede obtener el resultado de la primera consulta en una variable (fecha) y luego usar eso:

SELECT sysdate into query_date FROM dual;
insert into test (my_date) values (query_date)
-- or if you really want dynamic SQL, with a bind variable
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date;

O leyendo su pregunta literalmente, use la primera cadena como parte de la segunda cadena concatenándola:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;

Si imprimiera la segunda instrucción en lugar de ejecutarla, vería:

insert into test (my_date) SELECT sysdate FROM dual

... que es SQL válido. Esto funcionará si query_string es más complicado o se está construyendo dinámicamente. Pero si el número de expresiones de columna en query_string la lista de selección también varía, tendrá que construir la lista de columnas dinámicamente también, de lo contrario tendrá demasiadas o muy pocas columnas para la inserción.

Exactamente cómo lo haga depende de cómo esté construyendo la cadena de consulta; esencialmente, al agregar una expresión a la cadena de consulta, también agregaría un nombre de columna a una lista separada y terminaría con:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

donde column_list se construye como, por ejemplo, col1, col2 y query_string como select x.col1, y.col2 from ... .

No hay una razón obvia para usar SQL dinámico en lo que ha mostrado. O, si realmente está usando sysdate, necesita una consulta separada para obtener eso, como puede hacer:

insert into test (my_date) values (sysdate)

... así que asumo que tu escenario real es realmente más complicado. Pero tenga en cuenta que no usa los values palabra clave con insert ... select ... patrón. Puede con una sola columna y una subconsulta, pero no es una buena idea incluso entonces, y no funciona si tiene varias columnas en la subconsulta.