Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Curso de Ciência da Computação MATÉRIA: Banco de Dados II ASSUNTO: Stored Procedures (Procedimentos Armazenados) PROFESSOR: Ricardo Rodrigues Barcelar Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Objetivos: Apresentar a linguagem Structured Query Language (SQL); Utilizar stored procedures em sistemas de banco de dados. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Agenda: 1. Introdução 2. 3. 4. 5. Vantagens do uso de Stored Procedures Criação da Stored Procedure Comandos extras Manipulando Stored Procedure 7. Fonte de pesquisa Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Nas sessões anteriores foi visto o comando SELECT mais recentemente a utilização de Visões e seus detalhes. Nesta sessão veremos a utilização de Stored Procedures (Procedimentos Armazenados), na automatização de procedimentos no banco de dados. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional cd gravadora CP grav_id grav_nome grav_tel grav_contato autor CP aut_id aut_nome CP cd_id cd_nome cd_preco_venda cd_dt_lancamento CE1 grav_id mus_autor CP,CE1 mus_id CP,CE2 aut_id item_cd CP,CE2 cd_id CP,CE1 mus_id item_faixa musica CP mus_id mus_nome mus_duracao Patterns – Especificação de Casos de Uso Modelo de Dados Relacional STORED PROCEDURES (SP) É um programa escrito numa linguagem própria que é armazenado como parte do banco de dados. VANTAGENS DO USO DE STORED PROCEDURES? Redução de tráfico de rede. Aumenta a performance da aplicação, particularmente em uma WAN ou em uma conexão de baixa velocidade. Utilizando SP, elimina-se o processo de “parsed”, ou seja da query ter que ser analisada gramaticalmente, submetido ao optimizador para formulação de um plano de execução. SP são analisadas, optimizadas e armazenadas em uma forma executável no momento em que são adicionadas ao banco de dados. É possível executar operações muito mais complexas que uma simples query. Pode ser usada por aplicações distintas. Facilita a mnt, pois é possível alterar a SP sem ter que recompilar a App. Proporciona mais segurança ao BD, acessando tabelas que o usuário não pode. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional QUANDO USAR STORED PROCEDURES Sempre que puder! Não existem desvantagens em usar SP, entretanto existes duas limitações: vc tem que ser capaz de passar qualquer informação variável para a SP (parâmetros). Operações complexas podem ser limitadas. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional CRIAÇÃO DA STORED PROCEDURE Para criar uma SP, utilizamos o comando CREATE PROCEDURE: SINTAXE: CREATE PROCEDURE nome <parâmetros de entrada> RETURNS <parâmetros de saída> AS <declaração das variáveis locais> BEGIN <comandos da procedure> END Parâmetro de entrada são usados para passas os valores que serão usado para modificar o comportamento da SP. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Parâmetro de saída ou de retorno é o meio pelo qual a SP retorna informações para a aplicação cliente. OBS: Um parâmetro pode ser de qualquer tipo de dados exceto BLOB ou ARRAY. EXEMPLO: CREATE PROCEDURE pPrecoVenda( p_grav integer ) RETURNS( grav integer, precovenda decimal(10,2) ) AS BEGIN SELECT a.grav_id, AVG(a.cd_preco_venda) FROM cd a, gravadora g WHERE a.grav_id = g.grav_id AND a.grav_id = :p_grav GROUP BY a.grav_id INTO :grav, :precovenda; SUSPEND; END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Tanto parâmetro de entrada como parâmetros de saída devem estar entre parênteses. O comando SUSPEND pausa a SP até que o cliente busque os valores dos parâmetros de saída. DECLARANDO VARIÁVEIS Estas variáveis existem somente enquanto a SP está sendo executada e seu escopo é local. São declaradas depois da palavra chave AS e antes do BEGIN. SINTAXE: DECLARE VARIABLE nome TIPO; EXEMPLO: DECLARE VARIABLE valor decimal(10,2); Ao usar a variável esta deve ser precedida de dois pontos „:‟; Patterns – Especificação de Casos de Uso Modelo de Dados Relacional EXEMPLO: CREATE PROCEDURE mus_duracao ( p_mus INTEGER) AS DECLARE VARIABLE duracao_temp TIME; DECLARE VARIABLE musica_temp VARCHAR(50); BEGIN SELECT m.mus_nome, m.mus_duracao FROM musica m WHERE m.mus_id = :p_mus INTO :musica_temp, :duracao_temp; IF (:duracao_temp > '00:02:00') THEN BEGIN EXCEPTION musica_longa; SUSPEND; END ELSE BEGIN EXCEPTION musica_curta; END SUSPEND; END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional ELEMENTOS DA LINGUAGEM Inclui todas as construções de uma linguagem de programação estruturada, como: Cometários: /* Este é um comentário */ Bloco de comandos (BEGIN-END): É possível usar construções como IF-THENELSE e loops WHILE que somente podem conter um comando. Comandos de atribuição: observe o exemplo var1 = var2 * var3 var1 pode ser um parâmetro. Operador de concatenação: || (duas barras verticais) Além desses elementos é possível usar as expressões condicionais: BETWEEN LIKE Patterns – Especificação de Casos de Uso Modelo de Dados Relacional IN EXISTS ANY ALL IS NULL IS NOT NULL CONTAINING STARTING WITH Patterns – Especificação de Casos de Uso Modelo de Dados Relacional USANDO COMANDOS SQL NAS STORED PROCEDURES É possível usar comandos como SELECT, INSERT, UPDATE e DELETE exatamente como em uma query apenas com algumas alterações na sintaxe. Para todos esses comando é possível usar variáveis ou parâmetros. Não é possível usar comandos da DDL em uma SP: CREATE, DROP, GRANT, REVOKE, COMMIT e ROLLBACK EXEMPLO: CREATE PROCEDURE i_autor ( id INTEGER, nome VARCHAR(50)) AS BEGIN INSERT INTO autor (aut_id, aut_nome) VALUES (:id, :nome); SUSPEND; END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional USANDO FOR SELECT e DO Os exemplos anteriores que selecionam um ou mais valores para uma variável é bom desde que o SELECT retorne apenas uma linha. Para processar várias linhas deverá ser usado o comando FOR SELECT e DO. EXEMPLO: CREATE PROCEDURE p_buscacd ( p_grav INTEGER) RETURNS( grav INTEGER, cd VARCHAR(50)) AS BEGIN FOR SELECT grav_id, cd_nome FROM CD WHERE grav_id = :p_grav INTO :grav, :cd DO SUSPEND; END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional USO DO SUSPEND O comando SUSPEND diz para a SP suspender a execução até que uma solicitação de dados (fetch). SUSPEND não é somente usado com FOR SELECT DO. É usado sempre que a SP retorna um valor para o cliente. EXEMPLO: CREATE PROCEDURE p_qtdcd RETURNS( qtd INTEGER ) AS BEGIN SELECT COUNT(*) FROM cd INTO :qtd; SUSPEND; END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional DILEMA DO PONTO-E-VÍRGULA ‘;’ O console identifica o fim de cada comando em um script SQL pelo caractere de término de comando que é por default o ponto-e-vírgula „;‟ Isto funciona bem na maioria dos casos, mas não na criação de SP e triggers, pois cada comando interno da SP termina com ponto-e-vírgula. Dessa forma ao encontrar o primeiro ponto-e-vírgula o console entende que é o fim da criação da SP e anuncia o erro. A solução é trocar o caractere de término de comando por um outro diferente do ponto-e-vírgula. Para isso usamos o comando SET TERM, conforme script a seguir. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional EXEMPLO: SET TERM ^ ; CREATE PROCEDURE p_qtdautor RETURNS( qtd INTEGER ) AS BEGIN SELECT COUNT(*) FROM autor INTO :qtd; SUSPEND; END SET TERM ; ^ Observe que foi substituído o caractere ponto-e-vírgula que indica o termino de comando pelo ^ (circunflexo) logo na primeira linha do script e ao fim foi retornado ao caractere padrão. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional APAGANDO STORED PROCEDURE Para remover uma SP use o comando DROP PROCEDURE; SINTAXE: DROP PROCEDURE nome; EXEMPLO: DROP PROCEDURE p_qtdcd; Somente o SYSDBA ou o proprietário da SP podem apagá-la Patterns – Especificação de Casos de Uso Modelo de Dados Relacional ALTERANDO STORED PROCEDURE Para alterar uma SP use o comando ALTER PROCEDURE; A primeira impressão é que não iremos precisar desse comando. Entretanto, não é possível apagar uma SP que chamada por outra SP. SINTAXE: ALTER PROCEDURE nome <parâmetros de entrada> RETURNS <parâmetros de saída> AS <declaração das variáveis locais> BEGIN <comandos da procedure> END Patterns – Especificação de Casos de Uso Modelo de Dados Relacional EXEMPLO: ALTER PROCEDURE p_qtdautor RETURNS( quantidade INTEGER ) AS BEGIN SELECT COUNT(*) FROM autor INTO :quantidade; SUSPEND; END; Fazendo isso o elimina-se a dependência entre SP Patterns – Especificação de Casos de Uso Modelo de Dados Relacional CHAMANDO STORED PROCEDURE SP no Firebird são divididas em dois grupos de acordo com que são chamadas. SP que retornam valores através de parâmetros de saída são chamadas de select procedures, pois elas podem ser usadas no lugar do nome de uma tabela em um comando SELECT EXEMPLO: SELECT * FROM p_qtdautor É possível também chamar SP que possuem parâmetros de entrada, passando o parâmetro após o nome da SP no comando SELECT. EXEMPLO: SELECT * FROM p_buscacd(:P_GRAV) Patterns – Especificação de Casos de Uso Modelo de Dados Relacional CHAMANDO NON-SELECT PROCEDURE Non-select procedure são aquelas SP que não retornam qualquer resultado. Ela possui apenas parâmetros e entrada e realiza inserção e atualização de dados. O comando usado usado nestes casos é EXECUTE PROCEDURE EXEMPLO: SELECT * FROM p_qtdautor É possível também chamar SP que possuem parâmetros de entrada, passando o parâmetro após o nome da SP no comando SELECT. EXEMPLO: EXECUTE PROCEDURE i_autor(:ID, :NOME); Patterns – Especificação de Casos de Uso Modelo de Dados Relacional Realizar exercício referente a matéria. Patterns – Especificação de Casos de Uso Modelo de Dados Relacional ELMASRI, Ramez et all. Sistemas de Banco de Dados – Fundamentos e Aplicações. Rio de Janeiro: LTC, 2000. TODD, Bill. Introdução a Stored Procedures e Triggers no Firebird. Tradução Alessandro Cunha Fernandes, 2000.