Erro simples com procedure em oracle

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!!!
:wink: