Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Alternativa para uma tabela temporária MySQL no Oracle


No Oracle, você raramente precisa de uma tabela temporária em primeiro lugar. Você geralmente precisa de tabelas temporárias em outros bancos de dados porque esses bancos de dados não implementam consistência de leitura de várias versões e existe o potencial de que alguém lendo dados da tabela seja bloqueado enquanto seu procedimento é executado ou que seu procedimento faça uma leitura suja se não não salva os dados em uma estrutura separada. Você não precisa de tabelas temporárias globais no Oracle por nenhum desses motivos porque os leitores não bloqueiam os escritores e as leituras sujas não são possíveis.

Se você precisar apenas de um local temporário para armazenar dados enquanto executa cálculos PL/SQL, as coleções PL/SQL são mais comumente usadas do que as tabelas temporárias no Oracle. Dessa forma, você não está enviando dados do mecanismo PL/SQL para o mecanismo SQL e de volta para o mecanismo PL/SQL.
CREATE PROCEDURE do_some_processing
AS
  TYPE emp_collection_typ IS TABLE OF emp%rowtype;
  l_emps emp_collection_type;

  CURSOR emp_cur
      IS SELECT *
           FROM emp;
BEGIN
  OPEN emp_cur;
  LOOP
    FETCH emp_cur 
     BULK COLLECT INTO l_emps
    LIMIT 100;

    EXIT WHEN l_emps.count = 0;

    FOR i IN 1 .. l_emps.count
    LOOP
      <<do some complicated processing>>
    END LOOP;
  END LOOP;
END;

Você pode criar uma tabela temporária global (fora do procedimento) e usar a tabela temporária global dentro de seu procedimento da mesma forma que usaria qualquer outra tabela. Portanto, você pode continuar usando tabelas temporárias, se desejar. Mas posso contar nos dedos de uma mão o número de vezes que realmente precisei de uma tabela temporária no Oracle.