Arquivo da categoria: SQL

Como obter o próximo valor de um campo auto-incremental no mysql

Quem trabalha com o Oracle PL/SQL sabe que você pode obter isso através do NextVal() da seqüência, mas como fazer isso no MySQL?

Eu estava tentando gerar um código Hash para ser utilizado como uma referência externamente a um documento – para não exibir o ID interno usado na tabela -, mas não queria utilizar duas consultas (Um insert, e um select para obter o valor inserido).

Para resolver este problema em uma consulta apenas, criei uma função no banco de dados que me retornaria este valor:


CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
	RETURNS BIGINT
	LANGUAGE SQL
	NOT DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN

DECLARE Value BIGINT;

SELECT
	AUTO_INCREMENT INTO Value
FROM
	information_schema.tables
WHERE
	table_name = TableName AND
	table_schema = DATABASE();

RETURN Value;

END

Para utilizar esta função, basta passar como parâmetro o nome da tabela que se deseja obter o valor do próximo ID (campo auto-incremental):

SELECT getAutoincrementalNextval ('document')

No meu código, para gerar o Hash para o documento, fiz da seguinte forma:

INSERT INTO
    document (Code, Title, Body)
VALUES ( 				
    sha1( concat (convert (now(), char), ' ', getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);

Este código hash foi apenas uma forma de não expor ao usuário o código interno de meu documento. Para gerar um código único eu crio uma pré-imagem SHA-1 baseada na junção da hora atual e o ID do registro.

Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

Como pesquisar por um texto em todas as Stored Procedures do Banco de Dados Oracle?

Utilize a consulta abaixo:

 SELECT * FROM ALL_source WHERE UPPER(text) LIKE '%TEXTO%'; 

A consulta acima irá pesquisar pela palavra “TEXTO” dentro de todos os procedimentos armazenados contidos no servidor de banco de dados.

Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

Como utilizar um campo nomeado (ALIAS) em um GROUP BY em uma Consulta SQL

Por incrível que pareça isso não é possível! Então, se tiver um campo calculado, você terá que colocar a formula (ou case) dentro do “Group by”. Mas existe uma forma de contornar este problema, para isso siga o exemplo abaixo:

SELECT
*
FROM (
SELECT
trunc((months_between(sysdate, to_date('17/02/2015','dd/mm/yyyy')))/12) AS idade
FROM DUAL
)
GROUP BY idade
Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

Como retornar a linha de uma tabela quando o valor do count(*) for 0?

Este é um exemplo simples, imagine que você deseja mostrar todos as frutas, mesmo as que tem a quantidade com o valor 0. Em algumas ocasiões não é possível pois os filtros aplicados no Where terminam eliminando todos os registros daquele tipo de classe. No exemplo abaixo exibiria Morango, mas não seria exibida Banana.

SELECT
id
Count(*) quantidade
FROM
frutas
WHERE
frutas.cor = ‘Vermelho’
GROUP BY ID
ORDER BY ID

A solução para isso é listar todas os registros do dicionário de frutas e fazer um left join com a consulta.

SELECT
  dicionarioFrutas.id
  dicionarioFrutas.nome
  consultaFrutas.quantidade
FROM
  (SELECT frutas.id, frutas.nome FROM frutas) dicionarioFrutas,
  (
    SELECT
      id
      Count(*) quantidade
    FROM
      frutas
    WHERE
      frutas.cor = ‘Vermelho’
    GROUP BY ID
    ORDER BY ID
  ) consulta
  WHERE dicionarioFrutas.ID = consultaFrutas.ID (+) — LEFT JOIN do PL/SQL
  ORDER BY dicionarioFrutas.ID

Assim teriamos como resultado:

Morango: 1
Banana: Null

Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

MySQL: Como copio a tabela de um banco de dados para outro?

Estava precisando criar um outro banco de dados para trabalhar com uma nova versão de um sistema, e me deparei com uma dúvida: como faço para copiar a tabela de um banco de dados para outro banco de dados em um mesmo servidor?

A resposta é simples! Digamos que você tenha dois bancos “BancoAntigo” e “BancoNovo”, e você deseja copiar a tabela “Teste” do “BancoAntigo” para o “BancNovo”:

DROP TABLE IF EXISTS BancoNovo.Teste;
CREATE TABLE BancoNovo.Teste SELECT * FROM BancoAntigo.Teste;
Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

Como remover uma tabela, apenas se ela já tiver sido criada

Uma determinada tabela existe em meu banco de dados? Se você precisa descobrir isso, ou se está tentando remover uma tabela, apenas se ela já tiver sido criada no banco de dados (evitando assim o erro de execução), este código pode lhe ser útil:

if exists (select * from dbo.sysobjects where id = object_id(N'.[dbo].[NOMEDATABELA]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    DROP TABLE [dbo].[NOMEDATABELA]
Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).

No SQL, qual a diferença entre as cláusulas EXIST e IN?

A cláusula EXIST, segundo o site MSDN da microsoft, especifica uma subconsulta a ser testada quanto à existência de linhas. IN segundo o site MSDN da Microsoft determina se um valor especificado corresponde a qualquer valor em uma subconsulta ou uma lista.

Por exemplo: Imagine em um sistema previdenciário, um relatório que deseja trazer todos os credenciados que tem dependentes.

SELECT nome, matricula FROM credenciado WHERE EXIST (
    SELECT ID FROM dependente WHERE dependente.responsavelID = credenciado.ID
)

A consulta retornará apenas credenciados que tenham pelo menos um dependente. Como a claúsula EXIST deseja saber se existe pelo menos um, ele não realizará uma busca em toda a base de dados (Full Scan). No momento em que a subconsulta encontrar o primeiro resultado será finalizada, poupando recursos do servidor.

A cláusula IN tem um funcionamento diferente, utiliza-se quando o objetivo é verificar se a consulta retorna algum linha que esteja compatível com valores especificados.

Por exemplo: No mesmo sistema previdenciario, um relatório que se deseja trazer todos os credenciados que já morreram ou são inválidos.

SELECT nome, matricula FROM credenciado WHERE status IN (FALECIDO, INVALIDOS)

Os valores especificados podem ser através de uma subconsulta.

Natural de Salvador-BA, é graduado em Analise de Sistemas pela Universidade Católica do Salvador (UCSal, 2003), e Especialista em Engenharia de Software pela Universidade Salvador (2010).