AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 41239
Accepted
a1ex07
a1ex07
Asked: 2013-05-01 07:21:09 +0800 CST2013-05-01 07:21:09 +0800 CST 2013-05-01 07:21:09 +0800 CST

Usando sql dinâmico dentro do procedimento armazenado Oracle

  • 772

Supondo que eu tenha o seguinte procedimento

CREATE PROCEDURE foo (table1_id IN TABLE1.table1_id%type, 
                     table1_val IN TABLE1.table1_value%type) 
AS 
  SQL_UPDATE VARCHAR2(500) := 'UPDATE TABLE1 SET table1_value =:1 WHERE table1_id = :2';
BEGIN
  --.....
  --1 : 
    EXECUTE IMMEDIATE SQL_UPDATE USING foo.table1_val, foo.table1_id;
  --2 : 
    UPDATE TABLE1 SET table1_value = foo.table1_val WHERE table1_id = foo.table1_id;

END;

Além do estilo/legibilidade, há alguma penalidade de desempenho para usar a consulta dinâmica (1) em comparação com (2) nesses casos (quero dizer, quando é absolutamente evitável)?

Obrigada.

oracle dynamic-sql
  • 2 2 respostas
  • 4850 Views

2 respostas

  • Voted
  1. Best Answer
    David Aldridge
    2013-05-02T01:19:01+08:002013-05-02T01:19:01+08:00

    A única razão pela qual eu poderia fazer isso é se eu precisasse endereçar um objeto que pode não existir no tempo de compilação - por exemplo, se eu tivesse código para criar novas tabelas externas conforme necessário.

    Como isso implica, a instrução SQL dinâmica não é analisada quando o PL/SQL compila, então você não tem ideia se está correto ou não, e as dependências não são armazenadas no banco de dados.

    • 6
  2. druzin
    2013-05-01T08:38:47+08:002013-05-01T08:38:47+08:00

    Para instruções SQL simples, como a que você está descrevendo, há de fato um impacto geral no desempenho de um banco de dados Oracle. Como o SGBD deve fazer soft parsing do sql toda vez (o que também toma um pouco de tempo), ele precisa gravar no SGA e pode acabar tirando recursos de planos de execução já analisados ​​de consultas estáticas, já que o SGA não é infinito. Se estiver executando muitas instruções em SQL dinâmico dentro de procedimentos, você experimentará uma deterioração do desempenho com o tempo. Lembre-se de que detectar erros causados ​​por SQL dinâmico é muito mais complicado do que erros gerados por instruções SQL padrão.

    Eu recomendaria apenas recorrer ao SQL dinâmico se você estiver fazendo um trabalho administrativo complexo com objetos de banco de dados ou se sua consulta diferir muito com a entrada dos procedimentos. Mesmo nesses casos, você ficaria melhor com declarações if/else ditando suas consultas.

    • 4

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve