Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pool

[Resolvido] erro na procedure

Recommended Posts

Boa tarde estou estudando essa procedure e parei esse erro da linha 10, oq é esse erro?

 

create or replace PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO
IS PRC_OPCAO       CHAR(1); 
   PR_ID_GRUPO     INT; 
   PR_ID_USUARIO   INT;
   PR_DT_INCLUSAO  DATE;
   PR_DT_ALTERACAO DATE; 
   PR_ATIVO        INT;
BEGIN
DECLARE
CONT INT;   -- (ERROR na linha 10: PLS-00488: declaração inválida de variável: o objeto 'CONT' deve ser um tipo ou subtipo)
SET CONT :=0; 
BEGIN
 IF PRC_OPCAO = 'I' THEN 
   BEGIN 
      SELECT CONT INTO CL_USUARIO_GRUPO_ACESSO 
      FROM CL_USUARIO_GRUPO_ACESSO WHERE CL_USUARIO_GRUPO_ACESSO := PRC_CL_USUARIO_GRUPO_ACESSO;
      IF (CONT != 1) THEN 
          INSERT INTO CL_USUARIO_GRUPO_ACESSO VALUES(
          PR_ID_GRUPO    ,
          PR_ID_USUARIO  ,
          PR_DT_INCLUSAO ,
          PR_DT_ALTERACAO,
          PR_ATIVO                                  ); 
      ELSE
         IF (PRC_OPCAO ='U') THEN 
             BEGIN 
                UPDATE CL_USUARIO_GRUPO_ACESSO 
                SET CL_USUARIO_GRUPO_ACESSO = PR_CL_USUARIO_GRUPO_ACESSO,
                ID_USUARIO     = PR_ID_USUARIO  , 
                DATA_ALTERACAO = PR_DT_ALTERACAO,
                ATIVO          = PR_ATIVO 
                WHERE ID_GRUPO = PR_ID_GRUPO    ;
             END;
         ELSE 
             UPDATE CL_USUARIO_GRUPO_ACESSO
             SET DATA_ALTERACAO = PR_DT_ALTERACAO, 
             ATIVO = 0
             WHERE ID_GRUPO = PR_ID_GRUPO;
         END IF;   
      END IF;
   END;
 END IF;
END; 
END PRC_CL_USUARIO_GRUPO_ACESSO;

 

desde ja grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não use INT use NUMBER;

 

Não use SET atribua diretamente;

 

ABC := 123;

 

O resto parece correto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não use INT use NUMBER;

 

Não use SET atribua diretamente;

 

ABC := 123;

 

O resto parece correto.

 

Desde já obrigado Motta arrumei e deu outro erro na linha 15 olha:

 

create or replace PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO 
IS PRC_OPCAO       CHAR(1);  
   PR_ID_GRUPO     NUMBER;  
   PR_ID_USUARIO   NUMBER;
   PR_DT_INCLUSAO  DATE; 
   PR_DT_ALTERACAO DATE;  
   PR_ATIVO        NUMBER;
BEGIN 
DECLARE 
CONT NUMBER := 0;  
BEGIN 
 IF PRC_OPCAO = 'I' THEN  
   BEGIN  
      SELECT CONT INTO CL_USUARIO_GRUPO_ACESSO  
      FROM CL_USUARIO_GRUPO_ACESSO WHERE CL_USUARIO_GRUPO_ACESSO = PRC_CL_USUARIO_GRUPO_ACESSO;  -- [u]ERROR na linha 15: PL/SQL: ORA-00904: "PRC_CL_USUARIO_GRUPO_ACESSO": identificador inválido[/u] 
      IF (CONT != 1) THEN  
          INSERT INTO CL_USUARIO_GRUPO_ACESSO VALUES( 
          PR_ID_GRUPO    , 
          PR_ID_USUARIO  , 
          PR_DT_INCLUSAO , 
          PR_DT_ALTERACAO, 
          PR_ATIVO                                  );  
      ELSE 
         IF (PRC_OPCAO ='U') THEN  
             BEGIN  
                UPDATE CL_USUARIO_GRUPO_ACESSO  
                SET CL_USUARIO_GRUPO_ACESSO = PR_CL_USUARIO_GRUPO_ACESSO, 
                ID_USUARIO     = PR_ID_USUARIO  ,  
                DATA_ALTERACAO = PR_DT_ALTERACAO, 
                ATIVO          = PR_ATIVO  
                WHERE ID_GRUPO = PR_ID_GRUPO    ; 
             END; 
         ELSE  
             UPDATE CL_USUARIO_GRUPO_ACESSO 
             SET DATA_ALTERACAO = PR_DT_ALTERACAO,  
             ATIVO = 0 
             WHERE ID_GRUPO = PR_ID_GRUPO; 
         END IF;    
      END IF; 
   END; 
 END IF; 
END;  
END PRC_CL_USUARIO_GRUPO_ACESSO;

 

Li um pouco pesquisando antes de postar e achei um comentario seu dizendo q a tabela poderia ñ existir por via das duvidas dei um select depois exclui e recriei a tabela CL_USUARIO_GRUPO_ACESSO e tbm a PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO + o erro continua!

Desde já grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um select (sem cursor) em plsql deve retornar os valores para variáveis de memória

 

SELECT CONT INTO CL_USUARIO_GRUPO_ACESSO

 

faça

 

SELECT COUNT(*) INTO VN_QTD ...
      IF (VN_QTD != 1) THEN   

 

defina esta variável

 

create or replace PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO 
IS PRC_OPCAO       CHAR(1);  
   PR_ID_GRUPO     NUMBER;  
   PR_ID_USUARIO   NUMBER;
   PR_DT_INCLUSAO  DATE; 
   PR_DT_ALTERACAO DATE;  
   PR_ATIVO        NUMBER;
   VN_QTD          number;

 

Se você procurar encontra bom material público sobre plsql, no site da Oracle inclusive.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua sintaxe só seria aceita de CONT fosse coluna de CL_USUARIO_GRUPO_ACESSO .

 

Era isto ou uma contagem de registros ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

POXA MOTTA DESC SE ESTOU SENDO CHATO + O ERRO CONTINUA!

SEGUE O CODIGO:

 

CREATE OR REPLACE PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO 
IS PRC_OPCAO       CHAR(1);  
   PR_ID_GRUPO     NUMBER;  
   PR_ID_USUARIO   NUMBER;
   PR_DT_INCLUSAO  DATE; 
   PR_DT_ALTERACAO DATE;  
   PR_ATIVO        NUMBER;
   VN_QTD          NUMBER;
BEGIN 
DECLARE 
CONT NUMBER := 0;  
BEGIN 
 IF PRC_OPCAO = 'I' THEN  
   BEGIN  
      SELECT COUNT(*) 
      INTO VN_QTD  
      FROM CL_USUARIO_GRUPO_ACESSO 
      WHERE CL_USUARIO_GRUPO_ACESSO = PRC_CL_USUARIO_GRUPO_ACESSO; 
      IF (VN_QTD != 1) THEN  
          INSERT INTO CL_USUARIO_GRUPO_ACESSO VALUES( 
          PR_ID_GRUPO    , 
          PR_ID_USUARIO  , 
          PR_DT_INCLUSAO , 
          PR_DT_ALTERACAO, 
          PR_ATIVO                                  );  
      ELSE 
         IF (PRC_OPCAO ='U') THEN  
             BEGIN  
                UPDATE CL_USUARIO_GRUPO_ACESSO  
                SET CL_USUARIO_GRUPO_ACESSO = PR_CL_USUARIO_GRUPO_ACESSO, 
                ID_USUARIO     = PR_ID_USUARIO  ,  
                DATA_ALTERACAO = PR_DT_ALTERACAO, 
                ATIVO          = PR_ATIVO  
                WHERE ID_GRUPO = PR_ID_GRUPO    ; 
             END; 
         ELSE  
             UPDATE CL_USUARIO_GRUPO_ACESSO 
             SET DATA_ALTERACAO = PR_DT_ALTERACAO,  
             ATIVO = 0 
             WHERE ID_GRUPO = PR_ID_GRUPO; 
         END IF;    
      END IF; 
   END; 
 END IF; 
END;  
END PRC_CL_USUARIO_GRUPO_ACESSO;

 

--SEGUE O ERRO: ERROR na linha 16: PL/SQL: ORA-00904: "PRC_CL_USUARIO_GRUPO_ACESSO": identificador inválido

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT ...
WHERE CL_USUARIO_GRUPO_ACESSO = PRC_CL_USUARIO_GRUPO_ACESSO; 

 

No WHERE tem de ser uma coluna da tabela e a condição, algo assim ...

 

IS
 VS_PR_ID_GRUPO CL_USUARIO_GRUPO_ACESSO.PR_ID_GRUPO%TYPE;
...
SELECT ...
WHERE CL_USUARIO_GRUPO_ACESSO.PR_ID_GRUPO     = VS_PR_ID_GRUPO; 

 

Outra coisa, não dê as variáveis os mesmos nomes das colunas da tabela , confunde (quem lê e o compilador).

 

No mais só no ambiente para ver se está correto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Motta agora resolveu, fiz assim ó:

 

CREATE OR REPLACE PROCEDURE PRC_CL_USUARIO_GRUPO_ACESSO 
IS PRC_OPCAO       CHAR(1);  
   PR_ID_GRUPO     NUMBER;  
   PR_ID_USUARIO   NUMBER;
   PR_DT_INCLUSAO  DATE; 
   PR_DT_ALTERACAO DATE;  
   PR_ATIVO        NUMBER;
BEGIN 
DECLARE 
CONT NUMBER := 0;  
BEGIN 
 IF PRC_OPCAO = 'I' THEN  
   BEGIN  
      SELECT 1 INTO CONT  
      FROM CL_USUARIO_GRUPO_ACESSO WHERE ID_GRUPO = PR_ID_GRUPO; 
      IF (CONT != 1) THEN  
          INSERT INTO CL_USUARIO_GRUPO_ACESSO VALUES( 
          PR_ID_GRUPO    , 
          PR_ID_USUARIO  , 
          PR_DT_INCLUSAO , 
          PR_DT_ALTERACAO, 
          PR_ATIVO                                  );  
      ELSE 
         IF (PRC_OPCAO ='U') THEN  
             BEGIN  
                UPDATE CL_USUARIO_GRUPO_ACESSO  
                SET ID_USUARIO     = PR_ID_USUARIO  ,  
                    DATA_ALTERACAO = PR_DT_ALTERACAO, 
                    ATIVO          = PR_ATIVO  
                WHERE ID_GRUPO = PR_ID_GRUPO        ; 
             END; 
         ELSE  
             UPDATE CL_USUARIO_GRUPO_ACESSO 
             SET DATA_ALTERACAO = PR_DT_ALTERACAO,  
             ATIVO = 0 
             WHERE ID_GRUPO = PR_ID_GRUPO; 
         END IF;    
      END IF; 
   END; 
 END IF; 
END;  
END PRC_CL_USUARIO_GRUPO_ACESSO;

 

problema resolvido!

DESDE JÀ OBRIGADO você TEM ALGO A ACRESCENTAR?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.