quarta-feira, 25 de outubro de 2023

SQL - Procedimento de registo com função de teste e registo

-- Active: 1697134738767@@localhost@3306@ml_system

-- Admita que pretende registar numa tabela de uma base de dados

-- o email dos utilizadores de um sistema de informação.

-- Para fazer o registo utiliza a seguinte declaração SQL


INSERT INTO tb_username (username) VALUES ('admin');

-- Table 'ml_system.tb_username' doesn't exist


-- Como não tem a estrutura da tabela criada, recebe o erro


-- Para resolver este  problema terá de criar uma tabela

-- que guardará os registos de username.


-- Para evitar erros de criação, antes de criarmos removemos a

-- tabela já existente


DROP TABLE IF EXISTS tb_username;

-- AffectedRows : 0

CREATE TABLE

    tb_username(

        id INT AUTO_INCREMENT PRIMARY KEY,

        username VARCHAR(50) UNIQUE,

        dataReg TIMESTAMP

    );

-- AffectedRows : 0

DESCRIBE tb_username;


TRUNCATE tb_username;

-- AffectedRows : 0

SELECT * FROM tb_username;


INSERT INTO tb_username (username) VALUES ('admin');

-- AffectedRows : 1

SELECT * FROM tb_username;

INSERT INTO tb_username (username) VALUES ('admin');

-- Duplicate entry 'admin' for key 'username'


-- Isto sucede pois o campo username tem a chave UNIQUE

-- e como tal não pode ser duplicado.

-- Podemos evitar este problema, testando antes de registar.


SELECT COUNT(id) FROM tb_username WHERE username = 'admin';

-- E ao testarmos desta forma ficamos a saber se já existe o registo ou não.


-- O SQL tem estruturas que nos permitem condicionar ações

-- Podemos fazê-lo através de funções ou procedimentos.


-- Procedimento para registar


DROP FUNCTION IF EXISTS F1_TESTAR_USERNAME;


CREATE FUNCTION F1_TESTAR_USERNAME(a TEXT) RETURNS text

BEGIN

DECLARE res text;

DECLARE total int;

SET total = (SELECT COUNT(id) FROM tb_username WHERE username = a);

IF total = 1 THEN SET res = 'no';

ELSE 

SET res = a;

END IF;

RETURN res;

END;



DROP FUNCTION IF EXISTS F1_REGISTAR_USERNAME;


CREATE FUNCTION F1_REGISTAR_USERNAME(a TEXT) RETURNS BOOLEAN

BEGIN

DECLARE res BOOLEAN;

IF a = 'no' THEN

SET res = FALSE;

ELSE

INSERT INTO tb_username (username) VALUES (a);

SET res = TRUE;

END IF;

RETURN res;

END;


DROP PROCEDURE IF EXISTS P_TESTAR_REGISTAR_USER;

CREATE PROCEDURE P_TESTAR_REGISTAR_USER(IN a text)

BEGIN

SELECT F1_REGISTAR_USERNAME(F1_TESTAR_USERNAME(a)) AS resultado;

END;


CALL P_TESTAR_REGISTAR_USER('admin');


Sem comentários:

Enviar um comentário