Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Inserindo dados na tabela usando o Execute Immediate no Oracle


Você pode obter o resultado da primeira consulta em uma variável (data) e usar isso:
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;

Ou lendo sua pergunta literalmente, use a primeira string como parte da segunda string concatenando-a:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;

Se você imprimisse a segunda instrução em vez de executá-la, veria:
insert into test (my_date) SELECT sysdate FROM dual

... que é SQL válido. Isso funcionará se a query_string é mais complicado ou está sendo construído dinamicamente. Mas se o número de expressões de coluna no query_string a lista de seleção também varia, você terá que construir a lista de colunas dinamicamente também, caso contrário, você terá muitas ou poucas colunas para a inserção.

Exatamente como você faz isso depende de como você está construindo a string de consulta - essencialmente, ao adicionar uma expressão à string de consulta, você também adicionaria um nome de coluna a uma lista separada e terminaria com:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

onde column_list é construído como, digamos, col1, col2 e query_string como select x.col1, y.col2 from ... .

Não há uma razão óbvia para usar SQL dinâmico no que você mostrou. Ou, se você estiver realmente usando sysdate, qualquer necessidade de consulta separada para obter isso, como você pode fazer:
insert into test (my_date) values (sysdate)

... então suponho que seu cenário real seja realmente mais complicado. Mas observe que você não usa os values palavra-chave com um insert ... select ... padronizar. Você pode com uma única coluna e uma subconsulta, mas não é uma boa ideia, e não funciona se você tiver várias colunas na subconsulta.