Académique Documents
Professionnel Documents
Culture Documents
Parte II
Fundao Educacional de Andradina Faculdades Integradas Stella Maris de Andradina Tecnologia em Anlise e Desenvolvimento de Sistemas Prof MSc. Daniela Sbizera Justo
PL/SQL
PL/SQL
estende SQL:
PL/SQL
servidor Oracle
stored procedures e triggers blocos annimos. Ex: Ferramentas de desenvolvimento PL/SQL: SQLPlus, Rapid SQL, DBPartner, SQL Navigator, TOAD, SQL-Programmer, PL/SQL Developer, ... Pr-compiladores (ex: Pro*C), ODBC, JDBC, OCI ... Oracle Forms Oracle Reports
ferramentas Oracle
PL/SQL Engine
PL/SQL
Vantagens
suporte a SQL suporta a programao OO performance produtividade portabilidade integrao com Oracle segurana
PL/SQL
Recursos
condicionais repetio
Estrutura em blocos
DECLARE
/*variveis, tipos, cursores, subprogramas, ... */
BEGIN
/* instrues... */
EXCEPTION
/*tratamento de excees*/
END;
Exemplo
DECLARE v_count NUMBER; BEGIN SELECT count(*) INTO v_count FROM aluno; dbms_output.put_line('Vcount = ' || v_count); END;
Exemplo
DECLARE v_nome aluno.nome%TYPE; v_idade aluno.idade%TYPE; BEGIN SELECT nome, idade INTO v_nome, v_idade FROM aluno A WHERE A.nusp = 555; dbms_output.put_line('Aluno '|| v_nome || ', idade ' || v_idade); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('Aluno no encontrado'); END;
Estruturas condicionais
IF ... THEN .... END IF; IF ... THEN .... ELSE ... END IF; IF ... THEN .... ELSIF ... THEN... ELSE ... END IF; CASE <varivel> WHEN <valor> THEN <instrues> WHEN ... THEN... .... ELSE ... /*opcional*/ END CASE;
Exemplo
DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM matricula M WHERE M.sigla = 'SCE179' and M.ano = EXTRACT (YEAR FROM SYSDATE); IF v_count < 70 THEN insert into matricula values ('SCE179', 2, 222, EXTRACT (YEAR FROM SYSDATE), NULL); ELSE dbms_output.put_line('Turma lotada'); END IF; END;
Exemplo
DECLARE v_count NUMBER; e_lotada EXCEPTION; BEGIN SELECT COUNT(*) into v_count FROM matricula M WHERE M.sigla = 'SCE179' and M.ano = EXTRACT (YEAR FROM SYSDATE); IF v_count < 70 THEN insert into matricula values ('SCE179', 2, 444, EXTRACT (YEAR FROM SYSDATE), NULL); ELSE RAISE e_lotada; END IF; EXCEPTION WHEN e_lotada THEN dbms_output.put_line('Turma lotada'); WHEN OTHERS THEN dbms_output.put_line('Erro nro: ' || SQLCODE || '. Mensagem: ' || SQLERRM ); END;
Estruturas de Repetio
LOOP <instrues> EXIT WHEN <condio de parada> END LOOP; WHILE <condio> LOOP <instrues> END LOOP; FOR <contador> IN [REVERSE] <min>..<max> LOOP <instrues> END LOOP;
Exemplo
DECLARE v_disciplina Turma.Sigla%TYPE; v_nroAlunos Turma.NAlunos%TYPE; BEGIN v_disciplina := 'SCE103'; v_nroAlunos := 0; /* insere 6 turmas na disciplina SCE103 */ FOR nroTurma IN 1..6 LOOP INSERT INTO Turma VALUES (v_disciplina, nroTurma, v_nroAlunos); END LOOP; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Erro nro: ' || SQLCODE || '. Mensagem: ' || SQLERRM ); END;
Cursores
rea de contexto
rea de memria com informaes de processamento de uma instruo inclui conjunto ativo linhas retornadas por uma consulta handle para uma rea de contexto no uma varivel de memria tipos:
Cursor
implcito explcito
Cursor Explcito
Passos:
Exemplo
DECLARE v_alunos Aluno%ROWTYPE; CURSOR c_alunos IS SELECT * FROM Aluno; BEGIN OPEN c_alunos;
/*abre cursor - executa consulta */
LOOP FETCH c_alunos INTO v_alunos; /*recupera informao*/ EXIT WHEN c_alunos%NOTFOUND; dbms_output.put_line('Aluno: ' || v_alunos.nome || ' NUSP: ' || v_alunos.nusp); END LOOP; CLOSE c_alunos; END;
/*fecha cursor*/
Exemplo
DECLARE v_aluno Matricula.aluno%TYPE; v_nota Matricula.nota%TYPE; CURSOR c_alunos IS SELECT aluno, nota FROM Matricula WHERE sigla='SCE518' AND ano=2006 FOR UPDATE; BEGIN OPEN c_alunos; LOOP FETCH c_alunos INTO v_aluno, v_nota; EXIT WHEN c_alunos%NOTFOUND; dbms_output.put_line('Aluno: ' || v_aluno || ' Nota: ' || v_nota); END LOOP; CLOSE c_alunos; END;
Exemplo
DECLARE v_aluno Aluno.NUSP%TYPE; CURSOR c_alunos IS SELECT DISTINCT A.NUSP FROM Aluno A WHERE NOT EXISTS (SELECT M.aluno FROM Matricula M WHERE A.NUSP = M.aluno AND M.ano > 2001); BEGIN OPEN c_alunos; LOOP FETCH c_alunos INTO v_aluno; EXIT WHEN c_alunos%NOTFOUND; DELETE FROM Aluno WHERE NUSP = v_aluno; COMMIT; END LOOP; CLOSE c_alunos; END;
Cursor Explcito
Atributos
PL/SQL
Manual de consulta: