Dificuldade ao criar primeira procedure no oracle
Colegas,
tentei criar minha primeira procedure no oracle, mas retornou erro.
Meu objetivo era personalizar minha própria exception, dando a minha própria mensagem, mas pesquisei e não consegui.
Outra coisa foi que a mesma compilou com erro. Os erros são:
Error(3,25): PLS-00103: Encountered the symbol ";" when expecting one of the following: := . ) , @ % default character
Error(6,3): PLS-00103: Encountered the symbol ")" when expecting one of the following: := . ( @ % ; not null range default character
Podem me dar uma ajuda por favor?
tentei criar minha primeira procedure no oracle, mas retornou erro.
Meu objetivo era personalizar minha própria exception, dando a minha própria mensagem, mas pesquisei e não consegui.
Outra coisa foi que a mesma compilou com erro. Os erros são:
Error(3,25): PLS-00103: Encountered the symbol ";" when expecting one of the following: := . ) , @ % default character
Error(6,3): PLS-00103: Encountered the symbol ")" when expecting one of the following: := . ( @ % ; not null range default character
Podem me dar uma ajuda por favor?
CREATE OR REPLACE PROCEDURE SP_RESTRICOES( pTABELA INTEGER; pOPR VARCHAR2; pUSUARIO VARCHAR2 ) AS declare vEXCEPTION_COUNT EXCEPTION; PRAGMA_EXCEPTION_INIT(vEXCEPTION_COUNT, -1031); vCOUNT NUMBER; BEGIN SELECT COUNT(IDUSUARIO) FROM USUARIO WHERE IDUSUARIO = pUSUARIO INTO :vCOUNT; IF (vCOUNT = 0) THEN RAISE vEXCEPTION_COUNT; END IF; EXCEPTION WHEN vEXCEPTION_COUNT THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM); END SP_RESTRICOES;
Nilo Souza
Curtidas 0
Respostas
Anthony Accioly
22/05/2011
Tem uns errinhos de sintaxe, o primeiro que consegui detectar foi a troca de vírgulas por ponto e vírgulas.
De uma olhada nos exemplos de procedures em http://psoug.org/reference/procedures.html. Se esbarrar em mais alguma coisa que não consiga resolver com os exemplos, é só postar suas dúvidas aqui de novo.
Abraços,
CREATE OR REPLACE PROCEDURE SP_RESTRICOES( pTABELA INTEGER, pOPR VARCHAR2, pUSUARIO VARCHAR2 ) IS
De uma olhada nos exemplos de procedures em http://psoug.org/reference/procedures.html. Se esbarrar em mais alguma coisa que não consiga resolver com os exemplos, é só postar suas dúvidas aqui de novo.
Abraços,
GOSTEI 0
Nilo Souza
22/05/2011
Colegas a primeira procedure eu consegui, mas a segunda esta dando um erro que pesquisei e não consegui resolver.
Esta esta dando certo
Esta esta dando o seguinte erro:
Error(7,4): PLS-00428: an INTO clause is expected in this SELECT statement
Quebrei a cabeça e não consegui resolver!!!
Esta esta dando certo
create or replace
PROCEDURE ATUALIZARUSUARIO(pusuario in number,pnome in varchar2,pgrupo in number)
is
begin
update nsouza.usuario set nome=pnome,ID_GRUPO=pgrupo where IDUSUARIO=pusuario;
DBMS_OUTPUT.PUT_LINE('DADOS ATUALIZADOS');
commit;
exception
when others then
DBMS_OUTPUT.PUT_LINE('DADOS NÃO ATUALIZADOS');
ROLLBACK;
end ATUALIZARUSUARIO;
Esta esta dando o seguinte erro:
Error(7,4): PLS-00428: an INTO clause is expected in this SELECT statement
Quebrei a cabeça e não consegui resolver!!!
create or replace PROCEDURE SP_RESTRICOES (pUsuario in number)IS
BEGIN
select * from usuario where IDUSUARIO=pusuario;
DBMS_OUTPUT.PUT_LINE('DADOS ATUALIZADOS');
commit;
exception
when others then
DBMS_OUTPUT.PUT_LINE('DADOS NÃO ATUALIZADOS');
ROLLBACK;
END SP_RESTRICOES;
/
GOSTEI 0
Deivison Melo
22/05/2011
Fiz algumas correções nessa procedure!!
Veja se essa vai dar certo:
create or replace procedure sp_restricoes(
ptabela NUMBER,
popr VARCHAR2,
pusuario varchar2
)
is vexception_count exception;
pragma exception_init(vexception_count, -1031);
vcount number;
begin
select count(idusuario)
into vcount
from usuario
where upper(idusuario) = upper(pusuario); if (vcount = 0) then
raise vexception_count;
end if; exception
when vexception_count then
/*o sqlerrm já mostra o código e descrição do erro*/
raise_application_error(-20001,'Erro 01 - '||'erro: '||sqlerrm);
when others then
raise_application_error(-20002,'Erro 02 - '||'erro: '||sqlerrm);
end;
ptabela NUMBER,
popr VARCHAR2,
pusuario varchar2
)
is vexception_count exception;
pragma exception_init(vexception_count, -1031);
vcount number;
begin
select count(idusuario)
into vcount
from usuario
where upper(idusuario) = upper(pusuario); if (vcount = 0) then
raise vexception_count;
end if; exception
when vexception_count then
/*o sqlerrm já mostra o código e descrição do erro*/
raise_application_error(-20001,'Erro 01 - '||'erro: '||sqlerrm);
when others then
raise_application_error(-20002,'Erro 02 - '||'erro: '||sqlerrm);
end;
GOSTEI 0
Nilo Souza
22/05/2011
Uma duvida,
pq vc teve que usar Into e declarar uma varialvel VCount
GOSTEI 0
Rafael Mattos
22/05/2011
Uma duvida,
pq vc teve que usar Into e declarar uma varialvel VCount
vCount: ele criou para receber qtde de usuarios
Into: Serve para jogar o valor dentro da variavel
GOSTEI 0
Nilo Souza
22/05/2011
Então se eu quisese usar Select * from usuario eu teria que declarar 1 variavel do tipo varchar2 ou teria que declarar uma variavel para cada campo da tabela?
Não entendi bem essa parte na apostila que li. Se não for pedir muito poderia me dar um exemplo simples?
Obrigado desde já pela ajuda!
GOSTEI 0
Rafael Mattos
22/05/2011
Então se eu quisese usar Select * from usuario eu teria que declarar 1 variavel do tipo varchar2 ou teria que declarar uma variavel para cada campo da tabela?
Não entendi bem essa parte na apostila que li. Se não for pedir muito poderia me dar um exemplo simples?
Obrigado desde já pela ajuda!
* from não o correto seria vc fazer assim
----------------------
vcampo1 varchar(10);
vcampo2 varchar(10);
begin
select campo1, campo2 from usuario
into :vcampo1, vcampo2;
end
----------------------
qualquer banco q vc trabalhe vai ser parecida a regra o que muda vai ser a forma de declarar a variavel
GOSTEI 0
Nilo Souza
22/05/2011
Entendi, mas seu eu quiser usar o where ficaria como?
vcampo1 varchar(10);
vcampo2 varchar(10);
begin
select nome, login from usuario
into :vcampo1, vcampo2 where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
end
vcampo2 varchar(10);
begin
select nome, login from usuario
into :vcampo1, vcampo2 where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
end
GOSTEI 0
Rafael Mattos
22/05/2011
ficaria antes
begin
select nome, login from usuario
where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
and campo = :outrofiltro
into :vcampo1, vcampo2 where
end
begin
select nome, login from usuario
where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
and campo = :outrofiltro
into :vcampo1, vcampo2 where
end
GOSTEI 0
Nilo Souza
22/05/2011
ficou meio confuso. Pq 2 where, poderia fazer mais simples?
select nome, login from usuario
where idUsuario = psusuario (nota: pusuario é o paremetro da procedure)
and campo = :outrofiltro
into :vcampo1, vcampo2 where
GOSTEI 0
Nilo Souza
22/05/2011
Consegui muito obrigado!
GOSTEI 0
Anthony Accioly
22/05/2011
Resolvido?
Se sim, por favor feche o chamado.
Se sim, por favor feche o chamado.
GOSTEI 0