├── ddl.sql ├── dml.sql ├── projeto_final_estrutura.sql ├── projeto_final_produtos.sql └── views_functions.sql /ddl.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS banco ( 2 | numero INTEGER NOT NULL, 3 | nome VARCHAR(50) NOT NULL, 4 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 5 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 6 | PRIMARY KEY (numero) 7 | ); 8 | 9 | CREATE TABLE IF NOT EXISTS agencia ( 10 | banco_numero INTEGER NOT NULL, 11 | numero INTEGER NOT NULL, 12 | nome VARCHAR(80) NOT NULL, 13 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 14 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 15 | PRIMARY KEY (banco_numero,numero), 16 | FOREIGN KEY (banco_numero) REFERENCES banco (numero) 17 | ); 18 | 19 | CREATE TABLE IF NOT EXISTS cliente ( 20 | numero BIGSERIAL PRIMARY KEY, 21 | nome VARCHAR(120) NOT NULL, 22 | email VARCHAR(250) NOT NULL, 23 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 24 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 25 | ); 26 | 27 | CREATE TABLE IF NOT EXISTS conta_corrente ( 28 | banco_numero INTEGER NOT NULL, 29 | agencia_numero INTEGER NOT NULL, 30 | numero BIGINT NOT NULL, 31 | digito SMALLINT NOT NULL, 32 | cliente_numero BIGINT NOT NULL, 33 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 34 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 35 | PRIMARY KEY (banco_numero,agencia_numero,numero,digito,cliente_numero), 36 | FOREIGN KEY (banco_numero,agencia_numero) REFERENCES agencia (banco_numero,numero), 37 | FOREIGN KEY (cliente_numero) REFERENCES cliente (numero) 38 | ); 39 | 40 | CREATE TABLE IF NOT EXISTS tipo_transacao ( 41 | id SMALLSERIAL PRIMARY KEY, 42 | nome VARCHAR(50) NOT NULL, 43 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 44 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 45 | ); 46 | 47 | CREATE TABLE IF NOT EXISTS cliente_transacoes ( 48 | id BIGSERIAL PRIMARY KEY, 49 | banco_numero INTEGER NOT NULL, 50 | agencia_numero INTEGER NOT NULL, 51 | conta_corrente_numero BIGINT NOT NULL, 52 | conta_corrente_digito SMALLINT NOT NULL, 53 | cliente_numero BIGINT NOT NULL, 54 | tipo_transacao_id SMALLINT NOT NULL, 55 | valor NUMERIC(15,2) NOT NULL, 56 | data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 57 | FOREIGN KEY (banco_numero,agencia_numero,conta_corrente_numero,conta_corrente_digito,cliente_numero) REFERENCES conta_corrente(banco_numero,agencia_numero,numero,digito,cliente_numero) 58 | ); 59 | -------------------------------------------------------------------------------- /projeto_final_estrutura.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS produto_categoria CASCADE; 2 | DROP TABLE IF EXISTS produto CASCADE; 3 | DROP TABLE IF EXISTS cliente CASCADE; 4 | DROP TABLE IF EXISTS cliente_endereco CASCADE; 5 | DROP TABLE IF EXISTS cliente_telefone CASCADE; 6 | DROP TABLE IF EXISTS periodo_contato CASCADE; 7 | DROP TABLE IF EXISTS status CASCADE; 8 | DROP TABLE IF EXISTS pedido CASCADE; 9 | DROP TABLE IF EXISTS pedido_produto CASCADE; 10 | DROP TABLE IF EXISTS pedido_status CASCADE; 11 | 12 | CREATE TABLE IF NOT EXISTS produto_categoria ( 13 | id SMALLSERIAL NOT NULL, 14 | nome VARCHAR(50) NOT NULL, 15 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 16 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 17 | CONSTRAINT produto_categoria_pk PRIMARY KEY (id), 18 | CONSTRAINT produto_categoria_unique_1 UNIQUE (nome) 19 | ); 20 | 21 | CREATE OR REPLACE VIEW vw_produto_categoria AS ( 22 | SELECT id, 23 | nome, 24 | ativo 25 | FROM produto_categoria 26 | ); 27 | 28 | CREATE TABLE IF NOT EXISTS produto ( 29 | numero_serie VARCHAR(50) NOT NULL, 30 | produto_categoria_id INTEGER NOT NULL, 31 | nome VARCHAR(100) NOT NULL, 32 | valor NUMERIC(15,2) NOT NULL, 33 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 34 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 35 | CONSTRAINT produto_pk PRIMARY KEY (numero_serie), 36 | CONSTRAINT produto_categoria_fk_1 FOREIGN KEY (produto_categoria_id) REFERENCES produto_categoria(id), 37 | CONSTRAINT produto_valor_check_1 CHECK (valor >= 0) 38 | ); 39 | 40 | CREATE OR REPLACE VIEW vw_produto AS ( 41 | SELECT numero_serie, 42 | produto_categoria_id, 43 | nome, 44 | valor, 45 | ativo 46 | FROM produto 47 | WHERE valor >= 0 48 | ) WITH LOCAL CHECK OPTION; 49 | 50 | CREATE TABLE IF NOT EXISTS cliente ( 51 | cpfcnpj VARCHAR(14) NOT NULL, 52 | nome VARCHAR(150) NOT NULL, 53 | email VARCHAR(250) NOT NULL, 54 | senha VARCHAR(50) NOT NULL, 55 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 56 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 57 | CONSTRAINT cliente_pk PRIMARY KEY (cpfcnpj), 58 | CONSTRAINT cliente_email_check_1 UNIQUE (email) 59 | ); 60 | 61 | CREATE OR REPLACE VIEW vw_cliente AS ( 62 | SELECT cpfcnpj, 63 | nome, 64 | email, 65 | senha, 66 | ativo 67 | FROM cliente 68 | ); 69 | 70 | CREATE TABLE IF NOT EXISTS cliente_endereco ( 71 | id BIGSERIAL NOT NULL, 72 | cliente_cpfcnpj VARCHAR(14) NOT NULL, 73 | cep VARCHAR(8) NOT NULL, 74 | logradouro VARCHAR(200) NOT NULL, 75 | numero VARCHAR(10) NOT NULL, 76 | complemento VARCHAR(50), 77 | bairro VARCHAR(100) NOT NULL, 78 | cidade VARCHAR(100) NOT NULL, 79 | referencia VARCHAR(250), 80 | entrega BOOLEAN NOT NULL DEFAULT FALSE, 81 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 82 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 83 | CONSTRAINT cliente_endereco_pk PRIMARY KEY (id), 84 | CONSTRAINT cliente_fk_1 FOREIGN KEY (cliente_cpfcnpj) REFERENCES cliente(cpfcnpj) 85 | ); 86 | 87 | CREATE OR REPLACE VIEW vw_cliente_endereco AS ( 88 | SELECT cliente_cpfcnpj, 89 | cep, 90 | logradouro, 91 | numero, 92 | complemento, 93 | bairro, 94 | cidade, 95 | referencia, 96 | entrega, 97 | ativo 98 | FROM cliente_endereco 99 | ); 100 | 101 | CREATE TABLE IF NOT EXISTS periodo_contato ( 102 | id SMALLSERIAL NOT NULL, 103 | nome VARCHAR(15) NOT NULL, 104 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 105 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 106 | CONSTRAINT periodo_contato_pk PRIMARY KEY (id), 107 | CONSTRAINT periodo_contato_unique_1 UNIQUE (nome) 108 | ); 109 | 110 | CREATE OR REPLACE VIEW vw_periodo_contato AS ( 111 | SELECT id, 112 | nome, 113 | ativo 114 | FROM periodo_contato 115 | WHERE ativo IS TRUE 116 | ) WITH LOCAL CHECK OPTION; 117 | 118 | CREATE TABLE IF NOT EXISTS cliente_telefone ( 119 | id BIGSERIAL NOT NULL, 120 | cliente_cpfcnpj VARCHAR(14) NOT NULL, 121 | ddd VARCHAR(2) NOT NULL, 122 | telefone VARCHAR(10) NOT NULL, 123 | ramal VARCHAR(10), 124 | melhor_horario SMALLINT, 125 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 126 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 127 | CONSTRAINT cliente_telefone_pk PRIMARY KEY (id), 128 | CONSTRAINT cliente_fk_1 FOREIGN KEY (cliente_cpfcnpj) REFERENCES cliente(cpfcnpj), 129 | CONSTRAINT periodo_contato_fk_1 FOREIGN KEY (melhor_horario) REFERENCES periodo_contato(id), 130 | CONSTRAINT cliente_telefone_unico UNIQUE (cliente_cpfcnpj,ddd,telefone,ramal) 131 | ); 132 | 133 | CREATE OR REPLACE VIEW vw_cliente_telefone AS ( 134 | SELECT cliente_cpfcnpj, 135 | ddd, 136 | telefone, 137 | ramal, 138 | melhor_horario, 139 | ativo 140 | FROM cliente_telefone 141 | ); 142 | 143 | CREATE TABLE IF NOT EXISTS status ( 144 | id SMALLSERIAL NOT NULL, 145 | nome VARCHAR(20) NOT NULL, 146 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 147 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 148 | CONSTRAINT status_pk PRIMARY KEY (id), 149 | CONSTRAINT status_unique_1 UNIQUE (nome) 150 | ); 151 | 152 | CREATE OR REPLACE VIEW vw_status AS ( 153 | SELECT id, nome, ativo 154 | FROM status 155 | WHERE ativo IS TRUE 156 | ) WITH CASCADED CHECK OPTION; 157 | 158 | CREATE TABLE IF NOT EXISTS pedido ( 159 | id BIGSERIAL NOT NULL, 160 | status_id SMALLINT NOT NULL, 161 | cliente_cpfcnpj VARCHAR(14) NOT NULL, 162 | valor NUMERIC(15,2) NOT NULL, 163 | data_ultima_atualizacao TIMESTAMP WITHOUT TIME ZONE, 164 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 165 | CONSTRAINT pedido_pk PRIMARY KEY (id), 166 | CONSTRAINT status_fk_1 FOREIGN KEY (status_id) REFERENCES status(id), 167 | CONSTRAINT cliente_fk_1 FOREIGN KEY (cliente_cpfcnpj) REFERENCES cliente(cpfcnpj), 168 | CONSTRAINT pedido_valor_check_1 CHECK (valor >= 0) 169 | ); 170 | 171 | CREATE OR REPLACE VIEW vw_pedido AS ( 172 | SELECT status_id, 173 | cliente_cpfcnpj, 174 | valor, 175 | data_ultima_atualizacao, 176 | data_criacao 177 | FROM pedido 178 | ); 179 | 180 | CREATE TABLE IF NOT EXISTS pedido_produto ( 181 | id BIGSERIAL NOT NULL, 182 | pedido_id BIGINT NOT NULL, 183 | produto_numero_serie VARCHAR(50) NOT NULL, 184 | produto_categoria_id INTEGER NOT NULL, 185 | produto_nome VARCHAR(100) NOT NULL, 186 | produto_valor NUMERIC(15,2) NOT NULL, 187 | ativo BOOLEAN NOT NULL DEFAULT TRUE, 188 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 189 | data_modificacao TIMESTAMP WITHOUT TIME ZONE, 190 | CONSTRAINT pedido_produto_pk PRIMARY KEY (id), 191 | CONSTRAINT produto_fk_1 FOREIGN KEY (produto_numero_serie) REFERENCES produto(numero_serie), 192 | CONSTRAINT produto_categoria_fk_1 FOREIGN KEY (produto_categoria_id) REFERENCES produto_categoria(id), 193 | CONSTRAINT pedido_produto_produto_valor_check_1 CHECK (produto_valor >= 0) 194 | ); 195 | 196 | CREATE OR REPLACE VIEW vw_pedido_produto AS ( 197 | SELECT pedido_id, 198 | produto_numero_serie, 199 | produto_categoria_id, 200 | produto_nome, 201 | produto_valor, 202 | ativo, 203 | data_criacao, 204 | data_modificacao 205 | FROM pedido_produto 206 | WHERE produto_valor >= 0 207 | ); 208 | 209 | DROP VIEW IF EXISTS vw_pedido; 210 | ALTER TABLE IF EXISTS pedido DROP CONSTRAINT IF EXISTS status_fk_1; 211 | ALTER TABLE IF EXISTS pedido DROP COLUMN IF EXISTS status_id; 212 | 213 | CREATE OR REPLACE VIEW vw_pedido AS ( 214 | SELECT cliente_cpfcnpj, 215 | valor, 216 | data_ultima_atualizacao, 217 | data_criacao 218 | FROM pedido 219 | ); 220 | 221 | CREATE TABLE IF NOT EXISTS pedido_status ( 222 | pedido_id BIGINT NOT NULL, 223 | status_id SMALLINT NOT NULL DEFAULT 1, 224 | data_criacao TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, 225 | CONSTRAINT pedido_status_pk PRIMARY KEY (pedido_id,status_id), 226 | CONSTRAINT pedido_fk_1 FOREIGN KEY (pedido_id) REFERENCES pedido(id), 227 | CONSTRAINT status_fk_1 FOREIGN KEY (status_id) REFERENCES status(id) 228 | ); 229 | 230 | CREATE OR REPLACE VIEW vw_pedido_status AS ( 231 | SELECT pedido_id, 232 | status_id, 233 | data_criacao 234 | FROM pedido_status 235 | ); 236 | 237 | INSERT INTO vw_produto_categoria (nome) VALUES ('Eletrodomésticos') ON CONFLICT (nome) DO NOTHING; 238 | INSERT INTO vw_produto_categoria (nome) VALUES ('Celulares') ON CONFLICT (nome) DO NOTHING; 239 | INSERT INTO vw_produto_categoria (nome) VALUES ('Informática') ON CONFLICT (nome) DO NOTHING; 240 | INSERT INTO vw_produto_categoria (nome) VALUES ('Cama, Mesa e Banho') ON CONFLICT (nome) DO NOTHING; 241 | INSERT INTO vw_produto_categoria (nome) VALUES ('Música') ON CONFLICT (nome) DO NOTHING; 242 | INSERT INTO vw_produto_categoria (nome) VALUES ('Beleza e Perfumaria') ON CONFLICT (nome) DO NOTHING; 243 | INSERT INTO vw_produto_categoria (nome) VALUES ('Livros') ON CONFLICT (nome) DO NOTHING; 244 | INSERT INTO vw_produto_categoria (nome) VALUES ('Eletrônicos') ON CONFLICT (nome) DO NOTHING; 245 | INSERT INTO vw_produto_categoria (nome) VALUES ('Esportes') ON CONFLICT (nome) DO NOTHING; 246 | INSERT INTO vw_produto_categoria (nome) VALUES ('Viagens') ON CONFLICT (nome) DO NOTHING; 247 | 248 | INSERT INTO vw_status (nome) VALUES ('Inicial') ON CONFLICT (nome) DO NOTHING; 249 | INSERT INTO vw_status (nome) VALUES ('Em análise') ON CONFLICT (nome) DO NOTHING; 250 | INSERT INTO vw_status (nome) VALUES ('Em aprovação') ON CONFLICT (nome) DO NOTHING; 251 | INSERT INTO vw_status (nome) VALUES ('Aprovado') ON CONFLICT (nome) DO NOTHING; 252 | INSERT INTO vw_status (nome) VALUES ('Em produção') ON CONFLICT (nome) DO NOTHING; 253 | INSERT INTO vw_status (nome) VALUES ('Pronto para entrega') ON CONFLICT (nome) DO NOTHING; 254 | INSERT INTO vw_status (nome) VALUES ('Em rota') ON CONFLICT (nome) DO NOTHING; 255 | INSERT INTO vw_status (nome) VALUES ('Em devolução') ON CONFLICT (nome) DO NOTHING; 256 | INSERT INTO vw_status (nome) VALUES ('Entregue') ON CONFLICT (nome) DO NOTHING; 257 | INSERT INTO vw_status (nome) VALUES ('Cancelado') ON CONFLICT (nome) DO NOTHING; 258 | 259 | INSERT INTO vw_periodo_contato (nome) VALUES ('Manhã') ON CONFLICT (nome) DO NOTHING; 260 | INSERT INTO vw_periodo_contato (nome) VALUES ('Tarde') ON CONFLICT (nome) DO NOTHING; 261 | INSERT INTO vw_periodo_contato (nome) VALUES ('Noite') ON CONFLICT (nome) DO NOTHING; 262 | INSERT INTO vw_periodo_contato (nome) VALUES ('Madrugada') ON CONFLICT (nome) DO NOTHING; 263 | -------------------------------------------------------------------------------- /projeto_final_produtos.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO produto (numero_serie, produto_categoria_id, nome, valor) VALUES 2 | VALUES ('0000000001' , 1, 'Liquidificador' , 99.90 ), 3 | ('0000000002' , 1, 'Batedeira' , 79.90 ), 4 | ('0000000003' , 1, 'Mixer' , 29.90 ), 5 | ('0000000004' , 1, 'Grill' , 199.90 ), 6 | 7 | ('0000000005' , 2, 'Samsung' , 1090.90 ), 8 | ('0000000006' , 2, 'LG' , 990.00 ), 9 | ('0000000007' , 2, 'Motorola' , 1590.90 ), 10 | ('0000000008' , 2, 'ChingLing' , 215.90 ), 11 | 12 | ('0000000009' , 3, 'Monitor' , 499.90 ), 13 | ('0000000010' , 3, 'Mouse' , 49.90 ), 14 | ('0000000011' , 3, 'Impressora' , 500.00 ), 15 | ('0000000012' , 3, 'Teclado' , 200.90 ), 16 | 17 | ('0000000013' , 4, 'Toalha Grande' , 19.90 ), 18 | ('0000000014' , 4, 'Colchonete' , 300.15 ), 19 | ('0000000015' , 4, 'Toalha de rosto' , 15.50 ), 20 | ('0000000016' , 4, 'Porta Prato' , 15.05 ), 21 | 22 | ('0000000017' , 5, 'Violão' , 499.00 ), 23 | ('0000000018' , 5, 'Guitarra' , 1000.00 ), 24 | ('0000000019' , 5, 'Bateria' , 2999.00 ), 25 | ('0000000020' , 5, 'Violão' , 499.00 ), 26 | ('0000000021' , 5, 'Saxofone' , 300.40 ), 27 | 28 | ('0000000022' , 6, 'Desodorante' , 19.90 ), 29 | ('0000000023' , 6, 'Rimel' , 29.90 ), 30 | ('0000000024' , 6, 'Batom Vermelho' , 9.50 ), 31 | ('0000000025' , 6, 'Batom preto' , 7.90 ), 32 | 33 | ('0000000026' , 7, 'O Primo Basílio' , 10.90 ), 34 | ('0000000027' , 7, 'O Cortiço' , 9.00 ), 35 | ('0000000028' , 7, 'O Andarilho' , 10.00 ), 36 | ('0000000029' , 7, 'O Último Desejo' , 49.00 ), 37 | ('0000000030' , 7, 'A Espada do Destino' , 49.90 ), 38 | ('0000000031' , 7, 'Desventuras em série' , 10.00 ), 39 | ('0000000032' , 7, 'Piadas de Mau Humor' , 5.00 ), 40 | 41 | ('0000000033' , 8, 'Smartwatch' , 2000.00 ), 42 | ('0000000034' , 8, 'Relógio GShock' , 1599.00 ), 43 | ('0000000035' , 8, 'Fones de ouvido' , 999.90 ), 44 | ('0000000036' , 8, 'Conector Bluetooth' , 500.00 ), 45 | ('0000000037' , 8, 'Rádio AMFM' , 39.90 ), 46 | 47 | ('0000000038' , 9, 'Patins' , 199.60 ), 48 | ('0000000039' , 9, 'Skate' , 299.90 ), 49 | ('0000000040' , 9, 'Montain bike' , 1199.80 ), 50 | ('0000000041' , 9, 'Raquete biribol' , 10.30 ), 51 | ('0000000042' , 9, 'Gel de proteína' , 6.60 ), 52 | ('0000000043' , 9, 'Bola de Volei' , 39.90 ), 53 | 54 | ('0000000044' , 10, 'Europa' , 5999.90 ), 55 | ('0000000045' , 10, 'Asia' , 7000.00 ), 56 | ('0000000046' , 10, 'Nova Iorque' , 6799.00 ), 57 | ('0000000047' , 10, 'Chile' , 999.10 ), 58 | ('0000000048' , 10, 'Fernando de Noronha' , 11009.90 ), 59 | ('0000000049' , 10, 'Bonito' , 9899.20 ), 60 | ('0000000050' , 10, 'Argentina' , 799.90) 61 | ON CONFLICT (numero_serie) DO NOTHING; 62 | -------------------------------------------------------------------------------- /views_functions.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE VIEW vw_bancos AS ( 2 | SELECT numero, nome, ativo 3 | FROM banco 4 | ); 5 | 6 | CREATE OR REPLACE VIEW vw_agencias AS ( 7 | SELECT banco_numero, numero, nome, ativo 8 | FROM agencia 9 | ); 10 | 11 | CREATE OR REPLACE VIEW vw_bancos_agencias ( 12 | banco_numero, 13 | banco_nome, 14 | agencia_numero, 15 | agencia_nome, 16 | agencia_ativo 17 | ) AS ( 18 | SELECT banco.numero AS banco_numero, 19 | banco.nome AS banco_nome, 20 | agencia.numero AS agencia_numero, 21 | agencia.nome AS agencia_nome, 22 | agencia.ativo AS agencia_ativo 23 | FROM banco 24 | LEFT JOIN agencia ON agencia.banco_numero = banco.numero 25 | ); 26 | 27 | CREATE OR REPLACE VIEW vw_cliente AS ( 28 | SELECT numero, nome, email, ativo 29 | FROM cliente 30 | ); 31 | 32 | CREATE OR REPLACE VIEW vw_tipo_transacao AS ( 33 | SELECT id, nome 34 | FROM tipo_transacao 35 | ); 36 | 37 | CREATE OR REPLACE VIEW vw_conta_corrente AS ( 38 | SELECT banco_numero, 39 | agencia_numero, 40 | numero, 41 | digito, 42 | cliente_numero, 43 | ativo 44 | FROM conta_corrente 45 | ); 46 | 47 | CREATE OR REPLACE VIEW cliente_conta_corrente ( 48 | banco_numero, 49 | banco_nome, 50 | agencia_numero, 51 | agencia_nome, 52 | conta_corrente_numero, 53 | conta_corrente_digito, 54 | cliente_numero, 55 | cliente_nome 56 | ) AS ( 57 | SELECT banco.numero AS banco_numero, 58 | banco.nome AS banco_nome, 59 | agencia.numero AS agencia_numero, 60 | agencia.nome AS agencia_nome, 61 | conta_corrente.numero AS conta_corrente_numero, 62 | conta_corrente.digito AS conta_corrente_digito, 63 | cliente.numero AS cliente_numero, 64 | cliente.nome AS cliente_nome 65 | FROM cliente 66 | JOIN conta_corrente ON conta_corrente.cliente_numero = cliente.numero 67 | JOIN agencia ON agencia.numero = conta_corrente.agencia_numero 68 | JOIN banco ON banco.numero = agencia.banco_numero AND banco.numero = conta_corrente.banco_numero 69 | ); 70 | 71 | CREATE OR REPLACE VIEW vw_cliente_transacoes ( 72 | cliente_numero, 73 | cliente_nome, 74 | banco_nome, 75 | agencia_nome, 76 | conta_corrente_numero, 77 | conta_corrente_digito, 78 | transacao_nome, 79 | valor 80 | 81 | ) AS ( 82 | SELECT cliente.numero AS cliente_numero, 83 | cliente.nome AS cliente_nome, 84 | banco.nome AS banco_nome, 85 | agencia.nome AS agencia_nome, 86 | cliente_transacoes.conta_corrente_numero, 87 | cliente_transacoes.conta_corrente_digito, 88 | tipo_transacao.nome AS transacao_nome, 89 | cliente_transacoes.valor 90 | FROM cliente 91 | JOIN cliente_transacoes ON cliente_transacoes.cliente_numero = cliente.numero 92 | JOIN agencia ON agencia.numero = cliente_transacoes.agencia_numero 93 | JOIN banco ON banco.numero = cliente_transacoes.banco_numero 94 | JOIN tipo_transacao ON tipo_transacao.id = cliente_transacoes.tipo_transacao_id 95 | ); 96 | 97 | CREATE OR REPLACE FUNCTION banco_manage(p_numero INTEGER,p_nome VARCHAR(50),p_ativo BOOLEAN) 98 | RETURNS TABLE (banco_numero INTEGER, banco_nome VARCHAR(50), banco_ativo BOOLEAN) 99 | LANGUAGE PLPGSQL 100 | SECURITY DEFINER 101 | RETURNS NULL ON NULL INPUT 102 | AS $$ 103 | BEGIN 104 | -- O COMANDO ABAIXO VAI REALIZAR O INSERT OU O UPDATE DO BANCO 105 | -- O COMANDO ON CONFLICT PPODE SER USADO PARA FAZER NADA (DO NOTHING) 106 | -- OU PARA REALIZAR UM UPDATE NO NOSSO CASO. 107 | INSERT INTO banco (numero, nome, ativo) 108 | VALUES (p_numero, p_nome, p_ativo) 109 | ON CONFLICT (numero) DO UPDATE SET nome = p_nome, ativo = p_ativo; 110 | 111 | -- DEVEMOS RETORNAR UMA TABELA 112 | -- O RETURN NESTE CASO DEVE SER UMA QUERY 113 | RETURN QUERY 114 | SELECT numero, nome, ativo 115 | FROM banco 116 | WHERE numero = p_numero; 117 | END; $$; 118 | 119 | CREATE OR REPLACE FUNCTION agencia_manage(p_banco_numero INTEGER, p_numero INTEGER, p_nome VARCHAR(80), p_ativo BOOLEAN) 120 | RETURNS TABLE (banco_nome VARCHAR, agencia_numero INTEGER, agencia_nome VARCHAR, agencia_ativo BOOLEAN) 121 | LANGUAGE PLPGSQL 122 | SECURITY DEFINER 123 | RETURNS NULL ON NULL INPUT 124 | AS $$ 125 | DECLARE variavel_banco_numero INTEGER; 126 | BEGIN 127 | -- AQUI NÓS VAMOS VALIDAR A EXISTÊNCIA DO BANCO 128 | -- E PRINCIPALMENTE SE ELE ESTÁ ATIVO 129 | SELECT INTO variavel_banco_numero numero 130 | FROM vw_bancos 131 | WHERE numero = p_banco_numero 132 | AND ativo IS TRUE; 133 | 134 | -- SE OBTIVERMOS O RETORNO DO COMANDO ACIMA 135 | -- ENTÃO O BANCO EXISTE E ESTÁ ATIVO 136 | -- E PODEMOS PROSSEGUIR COM O INSERT DA AGÊNCIA 137 | IF variavel_banco_numero IS NOT NULL THEN 138 | -- O COMANDO ABAIXO VAI REALIZAR O INSERT OU O UPDATE DO BANCO 139 | -- O COMANDO ON CONFLICT PPODE SER USADO PARA FAZER NADA (DO NOTHING) 140 | -- OU PARA REALIZAR UM UPDATE NO NOSSO CASO. 141 | -- !!! REPAREM QUE O UPDATE SÓ SERÁ REALIZADO NOS CAMPOS NOME E ATIVO DA AGENCIA !!! 142 | -- !!! DESAFIO : QUE TAL MELHORAR ESSE CÓDIGO PARA SER POSSÍVEL A TROCA DE BANCO DAS AGÊNCIAS ??? 143 | INSERT INTO AGENCIA (banco_numero, numero, nome, ativo) 144 | VALUES (p_banco_numero, p_numero, p_nome, p_ativo) 145 | ON CONFLICT (banco_numero, numero) DO UPDATE SET 146 | nome = p_nome, 147 | ativo = p_ativo; 148 | END IF; 149 | 150 | -- DEVEMOS RETORNAR UMA TABELA 151 | -- O RETURN NESTE CASO DEVE SER UMA QUERY 152 | RETURN QUERY 153 | SELECT banco.nome AS banco_nome, 154 | agencia.numero AS agencia_numero, 155 | agencia.nome AS agencia_nome, 156 | agencia.ativo AS agencia_ativo 157 | FROM agencia 158 | JOIN banco ON banco.numero = agencia.numero 159 | WHERE agencia.banco_numero = p_banco_numero 160 | AND agencia.numero = p_numero; 161 | END; $$; 162 | 163 | CREATE OR REPLACE FUNCTION cliente_manage(p_numero INTEGER, p_nome VARCHAR(120), p_email VARCHAR(250), p_ativo BOOLEAN) 164 | RETURNS BOOLEAN 165 | LANGUAGE PLPGSQL 166 | SECURITY DEFINER 167 | CALLED ON NULL INPUT 168 | AS $$ 169 | BEGIN 170 | -- VAMOS VALIDAR SOMENTE OS PARÂMETROS MAIS IMPORTANTES 171 | IF p_numero IS NULL OR p_nome IS NULL THEN 172 | RETURN FALSE; 173 | END IF; 174 | 175 | -- FAREMOS O INSERT COM TRATAMENTO DE VALORES NULOS 176 | INSERT INTO cliente (numero, nome, email, ativo) 177 | VALUES (p_numero, p_nome, COALESCE(p_email,CONCAT(p_nome,'@sem_email')), COALESCE(p_ativo,TRUE)) 178 | ON CONFLICT (numero) DO UPDATE SET nome = p_nome, email = CONCAT(p_nome,'@sem_email'), ativo = COALESCE(p_ativo,TRUE); 179 | 180 | RETURN TRUE; 181 | END; $$; 182 | 183 | -- !!! DESAFIO 184 | -- ALTERAR A FUNÇÃO RECÉM CRIADA PARA CADASTRAR CLIENTES COM SUA CONTA CORRENTE 185 | -- A ESTRUTURA DA FUNÇÃO JÁ ESTÁ ABAIXO 186 | -- PRIMEIRO TEMOS QUE APAGAR A FUNÇÃO, POIS A MESMA JÁ EXISTE COM PARÂMETROS DIFERENTES 187 | 188 | DROP FUNCTION cliente_manage(p_numero INTEGER, p_nome VARCHAR(120), p_email VARCHAR(250), p_ativo BOOLEAN); 189 | 190 | -- AGORA DEVEMOS RECRIAR A FUNÇÃO CONTEMPLANDO TODAS AS VARIÁVEIS POSSÍVEIS 191 | -- NÃO ESQUEÇA DE QUE É IMPORTANTE ATUALIZAR ALGUNS CAMPOS CASO O CLIENTE JÁ EXISTA 192 | CREATE OR REPLACE FUNCTION cliente_manage( 193 | p_banco_numero INTEGER, 194 | p_agencia_numero INTEGER, 195 | p_cliente_numero INTEGER, 196 | p_cliente_nome VARCHAR(120), 197 | p_cliente_email VARCHAR(250), 198 | p_cliente_ativo BOOLEAN, 199 | p_conta_corrente_numero BIGINT, 200 | p_conta_corrente_digito SMALLINT, 201 | p_conta_corrente_ativo BOOLEAN 202 | ) 203 | RETURNS TABLE ( 204 | banco_nome VARCHAR, 205 | agencia_nome VARCHAR, 206 | cliente_nome VARCHAR, 207 | conta_corrente_numero BIGINT, 208 | conta_corrente_digito SMALLINT 209 | ) 210 | LANGUAGE PLPGSQL 211 | SECURITY DEFINER 212 | RETURNS NULL ON NULL INPUT 213 | AS $$ 214 | BEGIN 215 | -- SEU CÓDIGO AQUI 216 | END; $$; 217 | --------------------------------------------------------------------------------