Procedure INSERT - Oracle

16 respostas
Michel_M

Boa tarde Pessoal, estou montando uma procedure que conta a quantidade de registro em uma tabela(M_UNIDADE) e com isso é feito um INSERT(MM_MEMBRO) em uma outra tabela para cada registro da tabela M_UNIDADE. Gostaria de saber se sintaxe esta correta?

CREATE PROCEDURE inserirMM_MEMBRO() 
IS 

qt number; 
cont number = 0; 
id number; 

BEGIN 

qt = (SELECT count(*) FROM M_UNIDADE); 
id =(SELECT min(ID_UNIDADE) FROM M_UNIDADE); 

WHILE qt => cont LOOP 

cont = cont + 1; 
id = id + 1; 

INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE) 
VAlUES(id,1) 

END LOOP 

END inserirMM_MEMBRO; 
  
  
EXEC inserirMM_MEMBRO();

Desde já agradeço a todos.
E tb peço desculpa por postar aqui no guj essa minha duvida sobre procedure.

16 Respostas

B

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/fundamentals.htm#i16003

O operador é “<=” não “=>”. Você deve estar vendo espelhado :slight_smile:

Michel_M

Desculpa amigo se eu não entendi. Mais o seu exemplo que vc me passou teria que ficar assim né:

CREATE PROCEDURE inserirMM_MEMBRO()   
IS   
  
qt number;   
cont number = 0;   
id number;   
  
BEGIN   
  
qt = (SELECT count(*) FROM M_UNIDADE);   
id =(SELECT min(ID_UNIDADE) FROM M_UNIDADE);   
  
WHILE qt <= cont LOOP   
  
cont = cont + 1;   
id = id + 1;   
  
INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE)   
VAlUES(id,1)   
  
END LOOP   
  
END inserirMM_MEMBRO;   
    
    
EXEC inserirMM_MEMBRO();
E

testou? funcionou dessa forma que ele falou? (acredito que tenha funcionado)

Vou dar uma sugestão, a carga no servidor deve ser menor…

INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE)  
SELECT
  id + Level, 1
FROM (SELECT count(*) as qt FROM M_UNIDADE) a
CROSS JOIN (SELECT min(ID_UNIDADE) id FROM M_UNIDADE) b
CONNECT BY Level <= qt - id

Dá uma olhada se a lógica está certa (se é <= mesmo, etc…) e dá a resposta.

Michel_M

Opa valeu ai pela a sugestão!
Mais so uma duvida a sintexa é essa mesma?
A declaração das variáveis esta correta?

E

a sintaxe me parece ser essa mesma, e a declaração de variáveis também. Só o operador de atribuição que ao invés de = seria := se não me engano.

Michel_M

Aqui não funfo!

E

Qual erro?

gfkauer

Sua rotina não irá fncionar com esta estrutura…

o seu erro esta aqui:

qt = (SELECT count(*) FROM M_UNIDADE); id =(SELECT min(ID_UNIDADE) FROM M_UNIDADE);

Isto não funciona!! O correto é fazer algo assim:

Select count(1)
  Into qt
  From m_unidade;
Select min(id_unidade)
  Into id
  From m_unidade;

claro, tem outras opções, mas a mais rapida é esta.

Michel_M

Esse é o erro:

Avisos: —>
W (1): Warning: execução concluída com advertência
<—

Obs: estou usando o SGBD AQUA.

E

Não mostra nenhum outro erro?

Trocou o = por :=?

Verdade gfkauer, nem tinha reparado que faltava o INTO.

Me parece que faltam ; em dois lugares.

Michel_M

Ai galera peço desculpas pela a demora em responder. Mais com as alterações que foi
comentada acho que ficaria assim ne:

CREATE PROCEDURE inserirMM_MEMBRO()     
IS     
    
qt number;     
cont number = 0;     
id number;     
    
BEGIN     
    
SELECT count(*)
Into qt
FROM M_UNIDADE;
     
SELECT min(ID_UNIDADE) 
Into id 
FROM M_UNIDADE;     
    
WHILE qt <= cont LOOP     
    
cont := cont + 1;    
    
INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE)     
VAlUES(id,1);

id := id + 1;       
    
END LOOP     
    
END inserirMM_MEMBRO;     
      
      
EXEC inserirMM_MEMBRO();

...ou não?

E

reparei uma coisa:

cont number = 0;

mudar para

cont number := 0;

Michel_M

Somente isso?

CREATE PROCEDURE inserirMM_MEMBRO()       
IS       
      
qt number;       
cont number := 0;       
id number;       
      
BEGIN       
      
SELECT count(*)  
Into qt  
FROM M_UNIDADE;  
       
SELECT min(ID_UNIDADE)   
Into id   
FROM M_UNIDADE;       
      
WHILE qt <= cont LOOP       
      
cont := cont + 1;      
      
INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE)       
VAlUES(id,1);  
  
id := id + 1;         
      
END LOOP       
      
END inserirMM_MEMBRO;       
        
        
EXEC inserirMM_MEMBRO();
E

não lembro bem, faz tempo que não mexo com plsql, mas acho que o insert deveria ficar assim:

INSERT INTO MM_MEMBRO(ID_FILHO, ID_UNIDADE)
VAlUES(:id,1);

Michel_M

Ai pessoal esta dando erro:

PLS-00103: Encontrado o símbolo "END" quando um dos seguintes símbolos era esperado:

;

O símbolo ";" foi substituído por "END" para continuar.

CREATE OR REPLACE PROCEDURE "Teste"."inserirMM_MEMBRO"
IS

qt number;         
cont number := 0;         
id number;  

BEGIN

SELECT count(*)    
Into qt    
FROM M_UNIDADE;    
         
SELECT min(ID_UNIDADE)     
Into id     
FROM M_UNIDADE;         
        
WHILE qt >= cont LOOP         
        
cont := cont + 1;        
        
INSERT INTO MM_MEMBRO(ID_UNIDADE, ID_UNIDADE)         
VAlUES(id,2566);    
    
id := id + 1;           
        
END LOOP 

END "Teste"."inserirMM_MEMBRO";

Se alguem ai poder ajudar!

E

faz tempo que parei com plsql no oracle. rsrsr

Mas acho que depois do END LOOP tem um ;

E no final da SP tem que ter um /

Criado 30 de novembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 16
Participantes 4