Banco de Dados - Oracle

Criando Procedimentos usando parâmetros reais e formais

As funções e procedimentos de pl/sql tem um comportamento muito semelhante ao dos procedimentos e funções de outras linguagens.Partilham muitas propriedades. Coletivamente, os procedimentos e as funções também são designados por subprogramas...

por Márcio Novelli



De hoje em diante estarei contribuindo com artigos sobre PL/SQL. Espero conseguir atingir as expectativas dos leitores. No artigo de hoje irei falar sobre como criar procedimentos usando parâmetros reais e formais.

As funções e procedimentos de pl/sql tem um comportamento muito semelhante ao dos procedimentos e funções de outras linguagens. Partilham muitas propriedades. Coletivamente, os procedimentos e as funções também são designados por subprogramas.

-- CRIANDO UM PROCEDIMENTO ADDNEWSTUDENT

CREATE OR REPLACE PROCEDURE AddNewStudent (
p_FirstName students.first_name%TYPE,
p_LastName students.last_name%TYPE,
p_Major students.major%TYPE) AS
BEGIN
-- INSERINDO UMA NOVA LINHA NA TABELA STUDENTS.
-- GERANDO UM NOVO STUDENT SEQUENCE ID.
INSERT INTO students (ID, first_name, last_name,
major, current_credits)
VALUES (student_sequence.nextval, p_FirstName, p_LastName,
p_Major,
0);

-- E FETUADO O COMMIT IMPLICITO ANTES E DEPOIS DE O PROCEDIMENTO SER INSERIDO.
COMMIT;
END AddNewStudent;
/

O procedimento AddNewStudent e criado em primeiro lugar,com a instrução CREATE OR REPLACE PROCEDURE. Quando e criado um procedimento,primeiro e compiladoe,depois,e armazenado na base de dados em formato compilado,Este código compilado pode ser executado posteriormente a partir de outro ploco de PL/SQL.

Quando o procedimento e chamado, os parâmetros podem ser transferidos o nome do aluno(first name) ,(last name) e (major) curso são trasferidos para o procedimento.Dentro do procedimento,o parâmetro p_firstName terá o valor ‘Marcio’ ,p_lastName ‘Novelli’ e p_Major terá o valor de ‘Musica’,visto que estes literais são trasferidos para o procedimento quando e chamado.

Um procedimento e um bloco de PL/SQL , com uma secção declarativa,uma secção executável e uma secção de tratamento de excepcoes. Tal como num bloco anônimo, so a secção executável e obrigatória. Neste exemplo conforme descrevi logo acima no casso o procedimento AddNewStudent so tem uma secção executável.

Criar um Procedimento

A sintaxe para criar a instrução CREATE OR REPLACE PROCEDURE e:

CREATE [OR REPLACE] PROCEDURE nome_procedimento

[(argumento[{in|out|in out}] tipo,

argumento[{in|out|in out}] tipo)] {IS|AS}
corpo_procedimento

em que nome_procedimento e o nome do procedimento a criar,argumento e o nome de um parametro de procedimento,tipo e o tipo do parametro associado e corpo_procedimento e um bloco de PL/SQL que constitue o codigo do procedimento.

Para alterar o código de um procedimento e necessário suprimir o procedimento e cria-lo de novo.Visto que esta e uma operação comum enquanto o procedimento esta a ser desenvolvido,as palavras-chave OR REPLACE permitem que isto seja efetuado numa única operação.

Tal como outras instruções CREATE ,criar um procedimento e uma operação de DDL, por isso e efetuado um COMMIT implícito antes e depois de o procedimento ser criado.

Parâmetros e modos

Dado o procedimento addnewsutdent mostrado anteriormente,podemos chamar este procedimento da seguinte forma anônimo.



DECLARE
--DESCREVENDO VARIAVEIS NA TABELA STUDENTS COM PARAMETROS
v_NewFirstName students.first_name%TYPE :=
"MARCIO";
v_NewLastName students.last_name%TYPE :=
"NOVELLI";
v_NewMajor students.major%TYPE :=
"MATEMATICA";
BEGIN
-- ADICIONANDO MARCIO,NOVELLI,MATEMATICA.
AddNewStudent(v_NewFirstName, v_NewLastName, v_NewMajor);
END;
/

As variaveis declaradas no bloco anterios (v_NewFirstName,v_NewLastName,v_NewMajor) são passadas como argumentos para AddNewStudent . Neste contexto,são designadas por parâmetros reias,enquanto que os parâmetros na declaração do procedimento (p_Firstname,p_Lastname,p_Major) são designados por parâmetros formais.Os parâmetros reias contem os valores trasferidos para o procedimento quando este e chamado e recebem os resultados devolvidos pelo procedimento.Os parâmetros formais são os repositórios dos valores dos parâmetros reias.Quando o procedimento e chamado aos parâmetros formais são atribuídos os valores dos parâmetros reias.

Os parâmetros formais podem ter três modos : IN,OUT,IN OUT.Se o modo não for especificado para um parâmetro formal,assume o valor por omissão IN.

Logo abaixo o exemplo PARAMETRO mostra atribuições de pl/sql legais e ilegais.

CREATE OR REPLACE PROCEDURE Parametro (
p_InParametro IN NUMBER,
-- SOMENTE LEITURA (READ)
p_OutParametro OUT NUMBER,
-- SOMENTE ESCRITA (WRITE)
p_InOutParametro IN OUT NUMBER) IS
– LEITURA E ESCRITA

v_VariavelLocal NUMBER;
BEGIN

/* Associando o p_InParametro em v_VariavelLocal.Esta ocorrendo uma leitura(read) IN e legal */

v_VariavelLocal := p_InParametro; -- E Legal

/* ASSOCIANDO O VALOR 7 PARA p_InParametro

E ilegal pq esta gravando (write) e IN e somente leitura */

p_InParametro := 7; -- Illegal

/* ASSOCIANDO O VALOR 7 EM p_OutParametro. Gravando out (write) */

p_OutParametro :=
7; -- E Legal

/* Associando p_OutParametro para v_VariavelLocal

esta lendo read somente mas p_outParametro esta querendo gravar (write)então ocorre erro */
v_VariavelLocal := p_outParametro;
-- Illegal

/* Associando p_InOutParametro para v_VariavelLocal.

E legal pq esta (read)lendo ou gravando (write) IN OUT. */
v_VariavelLocal := p_InOutParametro;
-- Legal

/* Associando 7 em p_InOutParametro.E legal,esta gravando(write) */
p_InOutParametro :=
7; -- Legal
END Parametro;
-- finalizando o procedimento
/

O PL/SQL verifica a existência de atribuições legais quando o procedimento e criado. Por exemplo , PARAMETRO (logo acima) gera erros se tentarmos compila-los visto que contem atribuições ilegais.

Um parâmetro IN e um valor dentro de um procedimento, so pode aparecer no lado direito de uma instrução de atribuição.

Um parâmetro OUT e um valor,so podem aparecer no lado esquerdo de uma instrução de atribuição , e nao no lado direito,mesmo que tenha sido atribuído no procedimento.

Um parâmetro IN OUT e simultaneamente um valor,assim pode aparecer em qualquer um dos lados de uma instrução de atribuição.

Se nao houver parâmetros para um procedimento,nao se coloca parênteses na declaração de procedimento ou na chamada de procedimento.Isto também se aplica a funções,como vou descrever mais adiante nas minhas colunas.

Um forte abraço a todos, e até o próximo artigo !!!

Márcio Novelli

Márcio Novelli - Analista de Sistemas, Consultor Oracle 8i e 9i e chefe dos projetos do banco de dados Oracle pela empresa Walnut Telecomunicação e Informática LTDA - www.walnut.com.br. Bacharel em Ciência da Computação pela Universidade de Marília (UNIMAR). Especialização em Oracle 8i na Faculdade de Tecnologia IBTA (Instituto Brasileiro de Tecnologia Avançada - S.P). Certificado Introduction to Oracle9i: SQL Oracle9i Database Administration: Fundamentals I
Escreve artigos também para os sites da revista SQL Magazine (www.sqlmagazine.com.br), Portal Fire Masters (http://www.portalfiremasters.com.br/) e Freecode (www.freecode.com.br).