Jump to content

Archived

This topic is now archived and is closed to further replies.

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

Share this post


Link to post
Share on other sites

Não use INT use NUMBER;

 

Não use SET atribua diretamente;

 

ABC := 123;

 

O resto parece correto.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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

 

Era isto ou uma contagem de registros ?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.