Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SCE-ICMSC-USP
-1
Stored Procedures so procedimentos executados no servidor. Existem dois tipos de Stored Procedures:
Select Procedure so procedures usadas como se fossem uma relao em um comando SELECT. Uma
Select Procedure deve retornar um ou mais valores como parmetros de sada, ou um erro.
Executable procedures so procedures chamadas explicitamente por uma aplicao, atravs de um
comando EXECUTE PROCEDURE. Uma Executable procedure pode opcionalmente retornar
valores e/ou erros.
A sintaxe de ambos os tipos de Stored Procedures a mesma, e a diferena apenas conceitual, mudando
a forma como so definidos e utilizados. No entanto, existem alguns comandos disponveis que foram concebidos
especificamente para um dos tipos.
Note-se que Stored Procedures so armazenadas na base de dados, portanto somente se tornam
disponveis para outras transaes depois que aquela que o criou finalizada por um comando COMMIT.
SCE-ICMSC-USP
-2
O comando ALTER PROCEDURE idntico ao comando CREATE PROCEDURE, exceto que um procedimento com
o mesmo nome tem que estar armazenado na base de dados. Note-se que como o comando CREATE PROCEDURE,
este comando somente ficar disponvel para outras transaes aps o COMMIT da transao atual. Alm disso,
a alterao da procedure no requer a recompilao dos programas que a utilizam. Mas devido a isso, deve-se
tomar cuidado para no alterar a interface da procedure (como por exemplo o tipo ou nmero de parmetros de
entrada e de sada), ou os programas que a chamam tero que ser modificados tambm.
Se a procedure requer parmetros de entrada, eles devem ser passados como variveis da linguagem
hospedeira, ou como constantes. Se uma procedure retorna parmetros de sada, as variveis da linguagem
hospedeira que recebem esses valores devem estar indicados na clusula RETURNING_VALUES. Em isql no
indique a clusula RETURNING_VALUES, pois isql mostra os valores retornados automaticamente.
Exemplo:
EXECUTE PROCEDURE TotalTurmasMinistra /* TotalTurmasMinistra e' o nome */
Amauri, :CodigoDisciplina
/* Amauri 'e uma constante, CodigoDisciplina uma varivel*/
RETURNING_VALUES :TotTurmas;
SCE-ICMSC-USP
-3
SCE-ICMSC-USP
-4
O comando FOR SELECT difere de um comando SQL SELECT comum porque o FOR SELECT na realidade
um comando de loop, que para cada tupla recuperada pelo SELECT executa o <compound_statement>. A
<select_expr> um comando SQL SELECT normal, com a clusula INTO obrigatria.
No exemplo seguinte, esse comando usado na procedure TotalizaMatricula para contar quantas
matrculas existem na tabela Matricula para cada disciplina existente na tabela Disciplina, e ento atualizar
o atributo NNalunos dessa tabela.
Exemplo:
SET TERM !! ;
CREATE PROCEDURE TotalizaMatricula AS
DECLARE VARIABLE TotTurma INTEGER;
DECLARE VARIABLE Codigo DECIMAL(4);
BEGIN
FOR SELECT codigoturma, COUNT(NUSP)
FROM Matricula
GROUP BY codigoturma
INTO :Codigo, :TotTurma
DO BEGIN
UPDATE Turma
SET NNalunos=:TotTurma
WHERE codigo=:Codigo;
END
EXIT;
END !!
SET TERM ; !!
SCE-ICMSC-USP
-5
Variveis
Existem trs tipos de variveis que podem ser utilizadas no corpo de uma procedure:
Parmetros de entrada - utilizadas para passar variveis da aplicao para a procedure. Estas variveis
no podem ser utilizadas em triggers. Variveis de entrada so passadas por valor;
Parmetros de sada - utilizadas para passar variveis da procedure para a aplicao;
Variveis locais - utilizadas para armazenar valores internamente procedure. So visveis apenas dentro
do corpo da procedure, e devem ser sempre inicializadas cada vez que a procedure for chamada,
antes de poderem ser usadas. Todas as variveis locais devem ser definidas no incio do corpo
do procedimento, pelo comando
DECLARE VARIABLE var datatype;
Note-se que cada varivel local requer uma comando DECLARE VARIABLE, finalizado por
ponto-e-vrgula (;).
As variveis so utilizadas da mesma maneira onde uma expresso puder ser utilizada. Quando as
variveis forem utilizadas em comandos SQL, elas devem ser precedidas por dois-pontos (:), para indicar que so
variveis e no nomes de atributos. Nos demais comandos (como while e if) no devem ser utilizado o caracter
dois-pontos.
Quanto as variveis de sada de uma select procedure , os nomes das colunas do comando SELECT devem
coincidir em tipo e em nome com os que aparecem na definio da procedure. As variveis de sada de uma
executable procedure apenas o tipo de dados devem ser coincidentes