Realizar insert junto de select - SQL

Oi gente,

queria saber se tem uma forma de executar um insert junto de uma instrução select sem inserir o término " ; " do select?

Isso funciona se eu executar direto no banco:


 sql = "Select * from usuarios; Insert into usuarios(...) values(...)"

Mas eu preciso sem utilizar o " ; ", pois o código será executado numa aplicação PHP que não aceita ponto e vírgula:
Queria algo que fosse ± isso e funcionasse:

 // Sei que isso não funciona
 sql = "Select * from usuarios OR select 1 = (Insert into usuarios(...) values(...))"

Você quer executar 2 operações no BD, que não tem relação, mas ao mesmo tempo. É isso?

Isso mesmo, banco oracle.

E o seu sistema permite rodar um script assim? não seria melhor (e mais simples) fazer separado mesmo?

Você consegue fazer isso diretamente com SQL?

É um sistema que a empresa está adquirindo e eu estou testando, achei uma falha de SQL injection, estou tentando utilizar essa falha pra cadastrar informações demonstrando que o sistema tem falhas críticas.

Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.

Eu sei que você pode fazer uma subquerie, mais seria algo do tipo Insert into “table” values(“SEU SELECT AQUI”).

Mas não sei se é isso que precisa.

Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.[/quote]
Isso acontece por que o SGBD, seja ele qual for, precisa identificar um ponto de parada de uma instrução. Basicamente, este ponto de parada é o ‘;’ e, por isso ele deve ficar ali.
Se você deseja realizar duas instruções, terá que fazer duas chamadas. É a forma mais sensata e simples.
Se o insert dependesse do select, você poderia fazer um SELECT INTO.
Uma outra opção é criar uma stored procedure, que faria as duas coisas (select e insert) separadas (e faria muitas outras mais), porém com apenas uma requisição do sistema.

Não estou conseguindo, só utilizando o ponto e vírgula pra separar as querys, mas se tirar ele não consigo.[/quote]
Isso acontece por que o SGBD, seja ele qual for, precisa identificar um ponto de parada de uma instrução. Basicamente, este ponto de parada é o ‘;’ e, por isso ele deve ficar ali.
Se você deseja realizar duas instruções, terá que fazer duas chamadas. É a forma mais sensata e simples.
Se o insert dependesse do select, você poderia fazer um SELECT INTO.
Uma outra opção é criar uma stored procedure, que faria as duas coisas (select e insert) separadas (e faria muitas outras mais), porém com apenas uma requisição do sistema.[/quote]

É, realmente não pensei nisso.
Com isso vocÇê resolve seu problema, seja com o select into ou a SP.
Perfeito drsmachado

Acho que não, a realidade é que ela quer provar que existe um risco de SQL Injection, então ela realmente precisa fazer na mesma String.

Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...

Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...
[/quote]
Isso mesmo que eu pensei.
Eu acho que ela quer a parafernalha mesmo hehehe, se o CASE funcionar, acho que o problema tá resolvido

Pode ser, mas sem colocar o delimitador, ela não conseguirá, salvo se fizer mais de uma requisição ou se usar alguma parafernalha do tipo CASE WHEN <CONDICAO> THEN insert... ELSE select...
[/quote]
Isso mesmo que eu pensei.
Eu acho que ela quer a parafernalha mesmo hehehe, se o CASE funcionar, acho que o problema tá resolvido[/quote]
O problema é a condição para o case e, temos de lembrar que ele só funcionará com resultado igual para cada condição.

É, ela teria que passar a query exata pra gente, pra podermos identificar o ponto de risco, e partir daí.
Eu duvido que seja o SELECT * ali de cima