Procedure INSERT - Oracle

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?

[code]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();[/code]

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

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

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

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();  

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.

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

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.

Aqui não funfo!

Qual erro?

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.

Esse é o erro:

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

Obs: estou usando o SGBD AQUA.

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.

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

[code]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();[/code]

…ou não?

reparei uma coisa:

cont number = 0;

mudar para

cont number := 0;

Somente isso?

[code]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(); [/code]

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);

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.

[code]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”;[/code]

Se alguem ai poder ajudar!

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 /