Ir para conteúdo

POWERED BY:

Arquivado

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

rzzanatta

Erro : Procedure em oracle + delphi

Recommended Posts

Olá fiz uma procedure no oracle, e chamo ela no delphi, eu uso o storedproc da guia BDE, eu chamo assim:StoredProc1.Close;StoredProc1.ParamByName('P_PERIODO').AsInteger:=b;StoredProc1.ParamByName('P_CATEGORIA').AsInteger:=a;StoredProc1.ParamByName('V_DATAINI').AsDate:=dtpDataInicial.Date;StoredProc1.ParamByName('V_DATAFIM').AsDate:=dtpDataFinal.Date;StoredProc1.Open;So que me retorna erro quando chama essa storedproc, o erro é esse:"list index out of bounds(30)" depois dá "list index out of bounds(31)" depois "list index out of bounds(32)"o que estou fazendo de arrado?minha procedure é essa:CREATE OR REPLACE procedure atualiza (P_PERIODO IN NUMBER,P_CATEGORIA IN NUMBER, V_DATAINI IN DATE, V_DATAFIM IN DATE ) IS--DECLARACAO DE VARIAVEIS P_VALOR_LIMITE_CATEGORIA NUMBER(18,5); --VARIÁVEL QUE ARMAZENARÁ O VALOR LIMITE DA CATEGORIA P_DATA DATE := V_DATAINI; --VARIÁVEL QUE ARMAZENARÁ A DATA AUX_P_DATA DATE ; P_AUX_VALOR_CATEGORIA NUMBER(18,5):=0; --VARIÁVEL QUE SABERÁ QUANTO ESTÁ SENDO INSERIDO NAQUELE DIA p_datafim DATE := V_DATAFIM; CODIGO NUMBER; DATA_CALEND DATE;--DECLARACAO DE CURSORCURSOR LISTAS IS SELECT F.CO_MAQUINA, DECODE(I.NU_TEMPOREAL,NULL,I.NU_TEMPOPREVISTO,(I.NU_TEMPOREAL+I.NU_TEMPOPREVISTO)/2) AS TEMPOPREVISTO, I.CO_PERIODO, I.CO_FICHAPREVENTIVA, I.CO_SERVICOMANUTENCAO, F.NO_CATEGORIA_FICHAPREVENTIVA FROM IFICHAPREVENTIVA I, FICHAPREVENTIVA F WHERE F.CO_FICHAPREVENTIVA = I.CO_FICHAPREVENTIVA AND I.CO_PERIODO = P_PERIODO AND F.CO_CATEGORIA = P_CATEGORIA;BEGIN --ACHA O VALOR MÁXIMO DA CATEGORIA SELECT A.NU_TEMPODIARIO INTO P_VALOR_LIMITE_CATEGORIA FROM CATEGORIA A WHERE A.CO_CATEGORIA = P_CATEGORIA; INSERT INTO calendariomensal (CO_CALENDMENSAL, CO_CATEGORIA, DATA, DT_ULTATUALIZA) VALUES ( 1,P_CATEGORIA,To_Date(SYSDATE,'dd/mm/yyyy'),To_Date(SYSDATE,'dd/mm/yyyy')); SELECT MAX(CO_CALENDMENSAL) INTO CODIGO FROM CALENDARIOMENSAL; SELECT DATA INTO DATA_CALEND FROM calendariomensal WHERE CO_CALENDMENSAL= CODIGO; FOR REG1 IN LISTAS LOOP --ABRE O CURSOR IF (REG1.TEMPOPREVISTO + P_AUX_VALOR_CATEGORIA) <= P_VALOR_LIMITE_CATEGORIA AND (p_data <=p_datafim) THEN --ACHA UMA DATA VÁLIDA AUX_P_DATA := FN_ACHA_DATA(P_DATA,P_CATEGORIA); --CHAMA A FUNCAO PARA ACHAR A PROXIMA DATA P_DATA := AUX_P_DATA; IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'MECÂNICA' THEN INSERT INTO ICALENDARIOMENSAL (CO_CALENDMENSAL,CO_MAQUINA,NU_TEMPOMECANICA,DATA,CO_PERIODO,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( CODIGO,REG1.CO_MAQUINA, REG1.TEMPOPREVISTO,DATA_CALEND,REG1.CO_PERIODO,REG1.CO_FICHAPREVENTIVA, P_DATA,REG1.CO_SERVICOMANUTENCAO); END IF; IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'ELÉTRICA' THEN INSERT INTO icalendariomensal (CO_CALENDMENSAL,CO_MAQUINA,DATA,CO_PERIODO,NU_TEMPOELETRICA,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( codigo,REG1.CO_MAQUINA,DATA_CALEND,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FICHAPREVENTIVA,P_DATA,REG1.CO_SERVICOMANUTENCAO); END IF; IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'LUBRIFICAÇÃO' THEN INSERT INTO icalendariomensal (CO_CALENDMENSAL,CO_MAQUINA,DATA,CO_PERIODO,NU_TEMPOLUBRIFICACAO,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES (codigo,REG1.CO_MAQUINA,DATA_CALEND,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FICHAPREVENTIVA, P_DATA,REG1.CO_SERVICOMANUTENCAO); END IF; P_AUX_VALOR_CATEGORIA :=P_AUX_VALOR_CATEGORIA +REG1.TEMPOPREVISTO; --ATUALIZA O VALOR INSERIDO P/ O DIA ELSE IF (P_DATA <= P_DATAFIM) THEN --para nao executar alem do período desejado P_AUX_VALOR_CATEGORIA :=0;--ZERA PARA O NOVO DIA P_DATA :=P_DATA + 1; --JOGA O VALOR PARA A DATA MAIS UM DIA AUX_P_DATA := FN_ACHA_DATA(P_DATA,P_CATEGORIA); /*VERIFICA SE O PROXIMO DIA NAO É SAB/DOM/FERIADO E RETORNA O PROXIMO DIA ÚTIL*/ P_DATA := AUX_P_DATA;/* DEVOLVE O VALOR ATUALIZADO DA DATA PARA SE VOLTAR AO INCIO DO LOOP ESTAR COM O ÚLTIMO VALOR*/ IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'MECÂNICA' THEN INSERT INTO icalendariomensal (CO_CALENDMENSAL,CO_MAQUINA,NU_TEMPOMECANICA,DATA,CO_PERIODO,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( codigo,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO,DATA_CALEND,REG1.CO_PERIODO,REG1.CO_FICHAPREVENTIVA,P_DATA,REG1.CO_SERVICOMANUTENCAO); END IF; IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'ELÉTRICA' THEN INSERT INTO icalendariomensal (CO_CALENDMENSAL,CO_MAQUINA,DATA,CO_PERIODO,NU_TEMPOELETRICA,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES (codigo,REG1.CO_MAQUINA,DATA_CALEND,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FICHAPREVENTIVA,P_DATA,REG1.CO_SERVICOMANUTENCAO); END IF; IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'LUBRIFICAÇÃO' THEN INSERT INTO icalendariomensal (CO_CALENDMENSAL,CO_MAQUINA,DATA,CO_PERIODO,NU_TEMPOLUBRIFICACAO,CO_FICHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES (codigo,REG1.CO_MAQUINA,DATA_CALEND,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FICHAPREVENTIVA,P_DATA,REG1.CO_SERVICOMANUTENCAO); END if; P_AUX_VALOR_CATEGORIA :=P_AUX_VALOR_CATEGORIA +REG1.TEMPOPREVISTO; END IF; END IF; COMMIT WORK; END LOOP;EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;END;/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro verifique se seus parametros estão sendo passados corretamente. E em vez de você da um "open" de um Exec... que com certeza vai da certo... pois dentro da sua procedure você faz inserções e lembre-se de sempre usar em uma transação dentro do Delphi

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.