Você está na página 1de 7

Capítulo 4

DEFINIÇÃO E UTILIZAÇÃO
DE STORED PROCEDURES
Laboratório de Banco de Dados Cliente/Servidor 4 -1

4. Stored Procedure
É um algorítimo independente e pode ser chamado por qualquer
aplicação;
É armazenado no SGBD (no servidor);
Troca informações com a aplicação através de parâmetros;
Só é executado quando chamado por uma aplicação;
É executado no servidor.

Exemplo 1:

Construir/Codificar um procedimento para ser processado no servidor e


chamado por um aplicativo, com o objetivo de calcular o desconto de uma
venda realizada, obtendo o percentual de desconto em uma tabela de descontos.

Nome da Tabela: DESCONTO ( cod_produto , perc_desconto )

Parâmetros:
Entrada:
cod_prod,
valor_venda
Saída:
novo_valor_venda

CREATE OR REPLACE PROCEDURE CALCULA_DESCONTO


(COD_PROD IN NUMBER, VALOR_VENDA IN NUMBER,
NOVO_VALOR_VENDA OUT NUMBER) AS
PERCENTUAL INT;
BEGIN
SELECT PERC_DESCONTO INTO PERCENTUAL
FROM DESCONTO
WHERE COD_PRODUTO = COD_PROD;
NOVO_VALOR_VENDA := VALOR_VENDA - (VALOR_VENDA *
PERCENTUAL / 100);
END;
/
Laboratório de Banco de Dados Cliente/Servidor 4 -2

Exemplo 2:

Construir/Codificar um procedimento para ser processado no servidor e


chamado por um aplicativo, com o objetivo de atualizar o estoque de um
produto para uma venda.

Nome da Tabela:
PRODUTO ( pn , pnome, qtde_estoque , preco_unitario , local_fab )

Parâmetros:
Entrada:
cod_prod,
quant_vendida

Saída:
status

CREATE OR REPLACE PROCEDURE TRATAR_ESTOQUE


(COD_PROD IN NUMBER, QUANT_VENDIDA IN NUMBER,
STATUS OUT NUMBER) AS
ESTOQUE INT;
BEGIN
SELECT QTDE_ESTOQUE INTO ESTOQUE
FROM PRODUTO
WHERE PN=COD_PROD FOR UPDATE;
IF ESTOQUE >= QUANT_VENDIDA THEN
UPDATE PRODUTO SET QTDE_ESTOQUE = QTDE_ESTOQUE -
QUANT_VENDIDA WHERE PN = COD_PROD;
STATUS := 0;
ELSE
STATUS := 1;
END IF;
END;
/
Laboratório de Banco de Dados Cliente/Servidor 4 -3

1 - Exemplos de comandos no PL/SQL (SQL PLUS) do Oracle para ajudar nos


exercícios:

Ex.1) Procedimento para inicializar uma variável em Sql Plus.


sql> create or replace procedure inicializa (var out number) as
begin
var := 5;
end;
/
-- Execução do procedimento inicializa --

sql> variable z number; sql> variable z number;


sql> begin sql> exec inicializa (:z);
inicializa (:z); ou sql> print z;
end;
/
sql> print z;

Ex.2) Procedimento para leitura dos dados em uma tabela.


obs: a tabela deve estar criada e com dados.
ex: tabela PRODUTO (COD CHAR(2), QTD INT).
sql> create or replace procedure ler (x1 in varchar2, x2 out number) as
begin
select QTD into x2 from PRODUTO where COD = x1;
end;
/

- - execução do procedimento ler em Sql Plus --

variable b number;
accept a prompt ‘Entre com o codigo>’ (editar esses comandos em um editor de texto
begin (tipo Notepad) e salvar com extensão (.TXT)
ler (&a, :b); e em seguida executar o arquivo no prompt
end; do SQL).
/
sql> @c:\teste.txt;
executa no SQL PLUS o
sql> print b;
conteúdo do arquivo “teste.txt”.
Laboratório de Banco de Dados Cliente/Servidor 4 -4

Ex.3) Procedimento para atualização dos dados em uma tabela.


obs: usando a tabela produto.

sql> create or replace procedure gravar (a in varchar2, b in number) as


begin
update PRODUTO set QTD = b where COD = a;
end;
/
- - execução do procedimento gravar - -

variable x number;
accept a prompt ‘Entre com o codigo >’
accept b prompt ‘Entre com a quantidade >’ (editar esses comandos em um edtitor de texto
begin e salvar com extensão (.TXT) e em seguida
:x := &b; executar o arquivo no prompt do SQL).
gravar (&a, :x);
end;
/
executa no SQL PLUS o conteúdo do
sql> @c:\teste2.txt; arquivo “teste2.txt”.

sql> select * from produto;

Ex.4) Para imprimir o conteúdo de uma variável usar o comando:

DBMS_OUTPUT.PUT_LINE(‘Valor =’ || valor);
Laboratório de Banco de Dados Cliente/Servidor 4 -5

2- Aplicações PL/SQL genéricas para ajudar nos exercícios:


Essas aplicações são escritas em um arquivo TXT e executadas no SQL
PLUS.

Ex.1) A aplicação recebe o código do produto digitado pelo usuário na tela e


apresenta os dados gerais desse produto lido da tabela Produto.

ACCEPT PRODUTO PROMPT 'INFORME DADO : '


DECLARE
PRODUTO1 LIXO.CAMPO%TYPE;
BEGIN
SELECT CAMPO INTO PRODUTO1 FROM LIXO
WHERE CAMPO = &PRODUTO;
DBMS_OUTPUT.PUT_LINE('Fim de Programa');
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK WORK;
INSERT INTO ERRO(MENSAGEM)
VALUES (TO_CHAR(PRODUTO1) ||'PRODUTO RUIM');
COMMIT WORK;
END;
END;
/

Ex.2) A aplicação recebe o código do produto digitado pelo usuário na tela e


apresenta a quantidade desse produto lido da tabela Produto.

ACCEPT P PROMPT ‘INFORME DADO >’


DECLARE
Q PRODUTO.QTD%TYPE;
BEGIN
BEGIN :Q := 0; END;
SELECT QTD INTO :Q FROM PRODUTO WHERE COD = & P;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO ERRO (MENSAGEM)
VALUES (&P || ‘não existe’);
COMMIT WORK;
END;
/
Laboratório de Banco de Dados Cliente/Servidor -6
4

Você também pode gostar