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 NovelliDe 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 !!!