Gente eu tô tentando criar uma procedure em Oracle e dá o seguinte erro:
PROCEDURE Atualiza_Nome_Comunidade compilado
Warning: execução concluída com advertência
4/10 PLS-00103: Encontrado o símbolo “=” quando um dos seguintes símbolos era esperado:
constant exception
table LONG_
double ref char time timestamp interval date binary national
character nchar
O símbolo “” foi substituído por “=” para continuar.
9/1 PLS-00103: Encontrado o símbolo “UPDATE” quando um dos seguintes símbolos era esperado:
. ( * @ % & - + ; / at for mod remainder rem
<um expoente (**)> and or group having intersect minus order
start union where connect || multiset
O símbolo “;” foi substituído por “UPDATE” para continuar.
A procedure é assim:
CREATE OR REPLACE PROCEDURE Atualiza_Nome_Comunidade
(id_agente INTEGER, novo_nome VARCHAR, antigo_nome VARCHAR)
IS
permissao:='x';
id_criador:=0;
BEGIN
SELECT administrador INTO permissao
FROM funcionario
WHERE id_usuario_pk = id_agente
SELECT id_usuario_fk INTO id_criador
FROM comunidade
WHERE nome_comunidade=antigo_nome
IF(id_criador=id_agente OR permissao='S') THEN
UPDATE comunidade
SET nome_comunidade = novoNome
END IF
END Atualiza_Nome_Comunidade;
Pelo que entendi ele não entendeu o =‘S’… mas eu não sei o pq
Alguém pode me ajudar???
Olá.
Cada instrução precisa terminar com “;”
O correto seria assim:
CREATE OR REPLACE PROCEDURE Atualiza_Nome_Comunidade
(id_agente INTEGER, novo_nome VARCHAR, antigo_nome VARCHAR)
IS
permissao:='x';
id_criador:=0;
BEGIN
SELECT administrador INTO permissao
FROM funcionario
WHERE id_usuario_pk = id_agente;
SELECT id_usuario_fk INTO id_criador
FROM comunidade
WHERE nome_comunidade=antigo_nome;
IF(id_criador=id_agente OR permissao='S') THEN
UPDATE comunidade
SET nome_comunidade = novoNome;
END IF ;
END Atualiza_Nome_Comunidade;
Agora… vejo algumas possibilidades de resultados inesperados… nesse trecho:
UPDATE comunidade
SET nome_comunidade = novoNome;
você vai atualizar TODOS os registros da tabela comunidade. É isso mesmo que quer ou faltou um WHERE aí?
Outra coisa… quando você dá um SELECT into SuaVariavel, há duas possibilidades de falha: ou não retornar registro nenhum… ou retornar mais de um registro. Isso precisa do seguinte tratamento:
begin
SELECT administrador INTO permissao
FROM funcionario
WHERE id_usuario_pk = id_agente;
exception
when no_data_found then
... aqui o seu tratamento para nenhuma linha retornada
when too_many_rows then
... aqui o seu tratamento para retorno de mais de uma linha no select
end;
Olá, fiz algumas modificações, mas o mesmo erro persiste…
CREATE OR REPLACE PROCEDURE Atualiza_Nome_Comunidade
(id_agente INTEGER, novo_nome VARCHAR, antigo_nome VARCHAR)
IS
permissao:='x';
id_criador:=0;
BEGIN
SELECT administrador INTO permissao
FROM funcionario
WHERE id_usuario_pk = id_agente;
SELECT id_usuario_fk INTO id_criador
FROM comunidade
WHERE nome_comunidade=antigo_nome;
IF(id_criador=id_agente OR permissao='S') THEN
UPDATE comunidade
SET nome_comunidade = novoNome
WHERE nome_comunidade=antigo_nome;
END IF
END Atualiza_Nome_Comunidade;
Será q tem algum outro ; faltando???
Obrigada!
Brow,
Me parece que na declaração das variáveis está faltando o tipo:
permissao VARCHAR2(1) :=‘x’;
id_criador NUMBER :=0;
abs
Era isso mesmo!!!
Valeu!!!
