[oracle_br] Re: como usar um case num select?
se eu fizer assim esta certo? select case when campo = 20 then 1 else 2 end as valor from nometabela where --- Em oracle_br@yahoogrupos.com.br, "Pedro Henrique" <[EMAIL PROTECTED]> escreveu > > SQL> SELECT > 2DUMMY > 3 , CASE WHEN TO_CHAR(SYSDATE,'') = 2006 THEN 1 > 4 WHEN TO_CHAR(SYSDATE,'') = 2007 THEN (SELECT 99 FROM DUAL) > 5END CAMPO > 6 FROM DUAL > 7 / > > D CAMPO > - -- > X 99 > > Att, > > Pedro > > > > > > 2008/6/5 rzzanatta <[EMAIL PROTECTED]>: > > > aí galera faz tempo q nao uso e ja me esqueci de como usar um case num > > select, alguem aí tem uma script se uma sql com case pra fazer me > > lembrar? obrigado. > > > > > > > > > > -- > Pedro Henrique > > > [As partes desta mensagem que não continham texto foram removidas] >
[oracle_br] Re: como usar um case num select?
se eu fizer assim esta errado? select * from nomeTabela case when campo= 1 then 0 else 2 end as campo --- Em oracle_br@yahoogrupos.com.br, "Pedro Henrique" <[EMAIL PROTECTED]> escreveu > > SQL> SELECT > 2DUMMY > 3 , CASE WHEN TO_CHAR(SYSDATE,'') = 2006 THEN 1 > 4 WHEN TO_CHAR(SYSDATE,'') = 2007 THEN (SELECT 99 FROM DUAL) > 5END CAMPO > 6 FROM DUAL > 7 / > > D CAMPO > - -- > X 99 > > Att, > > Pedro > > > > > > 2008/6/5 rzzanatta <[EMAIL PROTECTED]>: > > > aí galera faz tempo q nao uso e ja me esqueci de como usar um case num > > select, alguem aí tem uma script se uma sql com case pra fazer me > > lembrar? obrigado. > > > > > > > > > > -- > Pedro Henrique > > > [As partes desta mensagem que não continham texto foram removidas] >
[oracle_br] como usar um case num select?
aí galera faz tempo q nao uso e ja me esqueci de como usar um case num select, alguem aí tem uma script se uma sql com case pra fazer me lembrar? obrigado.
[oracle_br] Procedure que retorna valor
Por um acaso como faço uma procedure que retorna valor?
[oracle_br] Duvida em sql
Estou com uma duvida. Quando faço um select e me retorna um valor nulo (nao econtrou nada), e estou pegando essa variavel e verificando se é nula, ele nao faz os procedimentos sendo nula. SELECT DATA INTO DATA_ICALEND FROM ICALENDARIOMENSAL WHERE CO_SERVICOMANUTENCAO = F_NUMERO AND ROWNUM =1 ORDER BY DATA desc; IF DATA_ICALEND is NULL THEN DATA_ICALEND:= DATA_BA; END if;
[oracle_br] Re: Cursor dúvida.
Bom acho que expressei errado: tenho os registro que o cursor me trouxe aí, e aí ele entra no loop, só que no loop ele chama uma função pra retornar uma data, e se essa data vier nula, esse registro do cursor nao poderá ser inserido na tabela, por isso tenho que pular esse regstro e ir para o proximo. (é + ou - assim) Como entao farei isso de pular um registro e ir para o proximo? CURSOR LISTAS IS SELECT . begin FOR REG1 IN LISTAS LOOP AUX_P_DATA :=FN_ACHA_DATA_BI (REG1.CO_SERVICOMANUTENCAO,V_DATAINI,V_DATAFIM,P_DATA); IF AUX_P_DATA = NULL THEN EXIT LOOP; END IF; end loop; end; --- Em oracle_br@yahoogrupos.com.br, "Rafael Alexandre Schmitt" <[EMAIL PROTECTED]> escreveu > > Teste se for diferente de null...se for diferente de null você faz o que precisa senão você pula para o próximo registro. > > > FOR REG1 IN LISTAS LOOP > > IF reg1.AUX_P_DATA IS NOT NULL THEN > >faça alguma coisa. > > END IF; > > end loop; > > Ou coloque no seu select a condição que você quer restringir. > > > -- > Rafael Alexandre Schmitt > [EMAIL PROTECTED] || www.hbtec.com.br > Blumenau - Santa Catarina > > - Original Message - > From: rzzanatta > To: oracle_br@yahoogrupos.com.br > Sent: Monday, June 04, 2007 3:22 PM > Subject: [oracle_br] Cursor dúvida. > > > Tenho esse curdor, só que quando entrar no loop, queria que quando o > AUX_P_DATA FOR NULL não aconteça nada, pule para o proximo registro > do cursor, como faço para pular para o proximo registro? > > CURSOR LISTAS IS > SELECT . > > begin > FOR REG1 IN LISTAS LOOP > > IF reg1.AUX_P_DATA = NULL THEN > > EXIT LOOP; > > END IF; > > > end loop; > > end; > > > > > > > > -- > Esta mensagem foi verificada pelo E-mail Protegido Terra. > Scan engine: McAfee VirusScan / Atualizado em 04/06/2007 / Versão: 5.1.00/5045 > Proteja o seu e-mail Terra: http://mail.terra.com.br/ > > > > -- > > > No virus found in this incoming message. > Checked by AVG Free Edition. > Version: 7.5.472 / Virus Database: 269.8.7/830 - Release Date: 3/6/2007 12:47 > > > > [As partes desta mensagem que não continham texto foram removidas] >
[oracle_br] Cursor dúvida.
Tenho esse curdor, só que quando entrar no loop, queria que quando o AUX_P_DATA FOR NULL não aconteça nada, pule para o proximo registro do cursor, como faço para pular para o proximo registro? CURSOR LISTAS IS SELECT . begin FOR REG1 IN LISTAS LOOP IF reg1.AUX_P_DATA = NULL THEN EXIT LOOP; END IF; end loop; end;
[oracle_br] Erro na procedure?
Olá, tenho essa Procedure criada no oracle, mas quando executo no delphi chamando ela, dá o erro "Error creating cursor handle", o que será que está errado, a procedure ou no delphi: 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_CATEGORIANUMBER(18,5):=0; --VARIÁVEL QUE SABERÁ QUANTO ESTÁ SENDO INSERIDO NAQUELE DIA p_datafimDATE := V_DATAFIM; CODIGO NUMBER; DATA_CALEND DATE; --DECLARACAO DE CURSOR CURSOR 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/'),To_Date (SYSDATE,'dd/mm/')); 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_FICHAP REVENTIVA,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_FICHAP REVENTIVA,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_FI CHAPREVENTIVA,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_FICHAP REVENTIVA,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_FICHAP REVENTIVA,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;
[oracle_br] Re: Problema com procedure
Obrigado pelas dicas vou tentar.. --- Em oracle_br@yahoogrupos.com.br, "FERNANDES Marco ASOFTTEK" <[EMAIL PROTECTED]> escreveu > > Então, > normalmente quando não entra no loop é pq não retornou linhas no select dele. > Ou deu algum problema na criação do cursor (sintaxe errada, param errado, sei lá). > > Se vc executar o select fora do cursor, numa janelinha de SQL mesmo ou no > SQLPlus, mas como exatamente os mesmos paramêtros e retornar as linhas > normalmente, aí vc elimina essa chance de Zero Row Returned ! > > Outra dica e essa é importantíssima nunca use ou só em último caso a sintaxe: > exception > when others then > null; > end; > > Isso é a morte em pessoa qualquer erro que ocorrer vc não ficará sabendo o que > foi e nem nada !!! inclusive o erro do seu cursor não aparece por causa disso ! > Eu sempre uso o seguinte: > EXCEPTION >WHEN OTHERS THEN > ROLLBACK WORK ; > RAISE_APPLICATION_ERROR( -20001, 'ERRO NA PROCEDURE PR_.' || SUBSTR(SQLERRM,1,200)); > END PR_ ; > > O uso do rowcount é exatamente esse que coloquei no email anterior. > Qdo vc dá o Open no cursor, vc carrega as linhas na memória. > Nesse momento vc pode executar o rowcount que te mostra qtas > linhas teu select trouxe no cursor. Ou seja, no seu caso vc criar > uma variável tipo number na sua proc e coloca a seguinte linha logo após > o open do seu cursor, assim: > Open Listas; > var_number := Listas%RowCount; > > Bom, o uso do dbms_output eu costumo usar frases bem bestas como: > dbms_output.put_line('passei por aqui !'); > Ou coloco os valores de variáveis e tal. > Aí, após a execução do procedure eu verifico o output e vejo > por onde passou e qual o valor das variáveis. > É um procedimento bem tosco mas eu antigamente usava > isso porque não tinha debugger ! risos > Também dá pra usar no exception que citei acima antes do raise ! > > É isso... qualquer coisa dá um grito. > > Abraço, > Marco. > > > > From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: rzzanatta > Sent: sexta-feira, 25 de maio de 2007 14:41 > To: oracle_br@yahoogrupos.com.br > Subject: [oracle_br] Re: Problema com procedure > > > > Verifiquei se nao entrou no loop pois ele nao faz o que esta dentro > do loop, só faz as coisas fora do loop, como uso dbms_output e > rowcount? > > --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> , "FERNANDES Marco A SOFTTEK" > escreveu > > > > Executando o select no braço retorna as linhas normalmente ? > > > > Como vc verificou que ele não entra no loop ? foi no debugger ? > > > > de vez em qdo tem uns debugger que dá pau apenas de vizualização > > no debug mas entrava normal no loop... sei lá pq ! > > > > As vezes eu prefiro colocar uns dbms_output pra ter certeza. > > > > Ah, tbém rola um rowcount no cursor pra saber se trouxe linhas ! > > var_number := nome_do_cursor%RowCount; > > > > abraço, > > Marco. > > > > > > > > > > From: oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> > [mailto:oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> ] On Behalf Of PUB: rzzanatta > > Sent: sexta-feira, 25 de maio de 2007 10:54 > > To: oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> > > Subject: [oracle_br] Re: Problema com procedure > > > > > > > > bom, tirei o case mas tambem nao funcionou. > > ele nao entra no loop nao sei o pq. > > O Oracle é 9i > > > > --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> <mailto:oracle_br% > 40yahoogrupos.com.br> , "FERNANDES Marco A SOFTTEK" > > escreveu > > > > > > Não tenho certeza, mas acho que há limitação no uso de CASE no > > cursor. > > > Pq não tenta trocar por decode e ver no que dá ? > > > > > > Seria interessante vc nos dizer a config do ambiente (versão do > > banco). > > > > > > Abraço, > > > Marco. > > > > > > > > > > > > From: oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> <mailto:oracle_br% > 40yahoogrupos.com.br> > > [mailto:oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> <mailto:oracle_br% > 40yahoogrupos.com.br> ] On Behalf Of PUB: rzzanatta > > > Sent: sexta-feira, 25
[oracle_br] Re: Problema com procedure
Verifiquei se nao entrou no loop pois ele nao faz o que esta dentro do loop, só faz as coisas fora do loop, como uso dbms_output e rowcount? --- Em oracle_br@yahoogrupos.com.br, "FERNANDES Marco ASOFTTEK" <[EMAIL PROTECTED]> escreveu > > Executando o select no braço retorna as linhas normalmente ? > > Como vc verificou que ele não entra no loop ? foi no debugger ? > > de vez em qdo tem uns debugger que dá pau apenas de vizualização > no debug mas entrava normal no loop... sei lá pq ! > > As vezes eu prefiro colocar uns dbms_output pra ter certeza. > > Ah, tbém rola um rowcount no cursor pra saber se trouxe linhas ! > var_number := nome_do_cursor%RowCount; > > abraço, > Marco. > > > > > From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: rzzanatta > Sent: sexta-feira, 25 de maio de 2007 10:54 > To: oracle_br@yahoogrupos.com.br > Subject: [oracle_br] Re: Problema com procedure > > > > bom, tirei o case mas tambem nao funcionou. > ele nao entra no loop nao sei o pq. > O Oracle é 9i > > --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> , "FERNANDES Marco A SOFTTEK" > escreveu > > > > Não tenho certeza, mas acho que há limitação no uso de CASE no > cursor. > > Pq não tenta trocar por decode e ver no que dá ? > > > > Seria interessante vc nos dizer a config do ambiente (versão do > banco). > > > > Abraço, > > Marco. > > > > ____ > > > > From: oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> > [mailto:oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> ] On Behalf Of PUB: rzzanatta > > Sent: sexta-feira, 25 de maio de 2007 09:21 > > To: oracle_br@yahoogrupos.com.br <mailto:oracle_br% 40yahoogrupos.com.br> > > Subject: [oracle_br] Problema com procedure > > > > > > > > Tenho essa procedure, só que ela funciona até o loop, e dentro do > > loop ele nao faz nada, o que será que estou fazendo de errado nesse > > loop? ou é erro no cursor? dá o erro "error creating cursor handle" > > > > CREATE OR REPLACE procedure atualiza (P_PERIODO IN > > VARCHAR2,P_CATEGORIA IN NUMBER, > > V_DATAINI IN DATE, V_DATAFIM > > IN DATE ) IS > > > > --DECLARACAO DE CURSOR > > CURSOR LISTAS IS > > SELECT F.CO_MAQUINA, > > CASE WHEN I.NU_TEMPOREAL IS null THEN I.NU_TEMPOPREVISTO > > ELSE (I.NU_TEMPOREAL+I.NU_TEMPOPREVISTO)/2 END 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; > > > > --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; > > -- > > BEGIN > > > > --ACHA O VALOR MÁXIMO DA CATEGORIA > > SELECT 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,sysdate,sysdate); > > OPEN LISTAS; > > --ABRE O CURSOR > > FOR REG1 IN LISTAS LOOP > > 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_FICHAP > > REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) > > VALUES ( 1,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO, > > P_DATA,REG1.CO_PERIODO, > > REG1.CO_FICHAPREVENTIVA,sysdate,REG1.CO_SERVICOMANUTENCAO); > > END if; > > > > IF REG1.NO_CATEGORIA_FICHAPREVENTIVA = 'ELÉTRICA' THEN > > > > INSERT INTO icalendariomensal > > > > > (CO
[oracle_br] Re: Problema com procedure
bom, tirei o case mas tambem nao funcionou. ele nao entra no loop nao sei o pq. O Oracle é 9i --- Em oracle_br@yahoogrupos.com.br, "FERNANDES Marco ASOFTTEK" <[EMAIL PROTECTED]> escreveu > > Não tenho certeza, mas acho que há limitação no uso de CASE no cursor. > Pq não tenta trocar por decode e ver no que dá ? > > Seria interessante vc nos dizer a config do ambiente (versão do banco). > > Abraço, > Marco. > > > > From: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of PUB: rzzanatta > Sent: sexta-feira, 25 de maio de 2007 09:21 > To: oracle_br@yahoogrupos.com.br > Subject: [oracle_br] Problema com procedure > > > > Tenho essa procedure, só que ela funciona até o loop, e dentro do > loop ele nao faz nada, o que será que estou fazendo de errado nesse > loop? ou é erro no cursor? dá o erro "error creating cursor handle" > > CREATE OR REPLACE procedure atualiza (P_PERIODO IN > VARCHAR2,P_CATEGORIA IN NUMBER, > V_DATAINI IN DATE, V_DATAFIM > IN DATE ) IS > > --DECLARACAO DE CURSOR > CURSOR LISTAS IS > SELECT F.CO_MAQUINA, > CASE WHEN I.NU_TEMPOREAL IS null THEN I.NU_TEMPOPREVISTO > ELSE (I.NU_TEMPOREAL+I.NU_TEMPOPREVISTO)/2 END 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; > > --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; > -- > BEGIN > > --ACHA O VALOR MÁXIMO DA CATEGORIA > SELECT 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,sysdate,sysdate); > OPEN LISTAS; > --ABRE O CURSOR > FOR REG1 IN LISTAS LOOP > 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_FICHAP > REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) > VALUES ( 1,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO, > P_DATA,REG1.CO_PERIODO, > REG1.CO_FICHAPREVENTIVA,sysdate,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_FICHAP > REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) > VALUES ( > 1,REG1.CO_MAQUINA,P_DATA,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FI > CHAPREVENTIVA,sysdate,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_FI > CHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) > VALUES ( > 1,REG1.CO_MAQUINA,P_DATA,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FI > CHAPREVENTIVA, sysdate,REG1.CO_SERVICOMANUTENCAO); > END if; > > P_AUX_VALOR_CATEGORIA :=P_AUX_VALOR_CATEGORIA + > REG1.TEMPOPREVISTO; --ATUALIZA O VALOR INSERIDO P/ O DIA > --DEVE ATUALIZAR A TABELA DE LISTAS COM A DATA INSERIDA > > ELSE > > if (p_Data <= p_datafim) then --para nao executar alem do > período desejado > BEGIN > 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_FICHAP > REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) > VALUES ( 1,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO, > P_DATA,REG1.C
[oracle_br] Problema com procedure
Tenho essa procedure, só que ela funciona até o loop, e dentro do loop ele nao faz nada, o que será que estou fazendo de errado nesse loop? ou é erro no cursor? dá o erro "error creating cursor handle" CREATE OR REPLACE procedure atualiza (P_PERIODO IN VARCHAR2,P_CATEGORIA IN NUMBER, V_DATAINI IN DATE, V_DATAFIM IN DATE ) IS --DECLARACAO DE CURSOR CURSOR LISTAS IS SELECT F.CO_MAQUINA, CASE WHEN I.NU_TEMPOREAL IS null THEN I.NU_TEMPOPREVISTO ELSE (I.NU_TEMPOREAL+I.NU_TEMPOPREVISTO)/2 END 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; --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; -- BEGIN --ACHA O VALOR MÁXIMO DA CATEGORIA SELECT 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,sysdate,sysdate); OPEN LISTAS; --ABRE O CURSOR FOR REG1 IN LISTAS LOOP 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_FICHAP REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( 1,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO, P_DATA,REG1.CO_PERIODO, REG1.CO_FICHAPREVENTIVA,sysdate,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_FICHAP REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( 1,REG1.CO_MAQUINA,P_DATA,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FI CHAPREVENTIVA,sysdate,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_FI CHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( 1,REG1.CO_MAQUINA,P_DATA,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FI CHAPREVENTIVA, sysdate,REG1.CO_SERVICOMANUTENCAO); END if; P_AUX_VALOR_CATEGORIA :=P_AUX_VALOR_CATEGORIA + REG1.TEMPOPREVISTO; --ATUALIZA O VALOR INSERIDO P/ O DIA --DEVE ATUALIZAR A TABELA DE LISTAS COM A DATA INSERIDA ELSE if (p_Data <= p_datafim) then --para nao executar alem do período desejado BEGIN 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_FICHAP REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( 1,REG1.CO_MAQUINA,REG1.TEMPOPREVISTO, P_DATA,REG1.CO_PERIODO, REG1.CO_FICHAPREVENTIVA,sysdate,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_FICHAP REVENTIVA,DT_ULTATUALIZA,CO_SERVICOMANUTENCAO) VALUES ( 1,REG1.CO_MAQUINA,P_DATA,REG1.CO_PERIODO,REG1.TEMPOPREVISTO,REG1.CO_FI CHAPREVENTIVA,sysdate,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_FI CHAPREVENTIVA,DT_ULTATUALIZA,CO_SERVICO
[oracle_br] Ajuda.....
Vamos lá, eu tenho que montar um calendário dos serviços de manutenção, cada serviço tem seu tempo defenido, cada serviço está em uma categoria, cada categoria tem seu tempo estabelecido por dia tipo categoria X tem 100 minutos por dia. Entao, apartir dos serviços trazidos por uma sql , eu tenho que iserir esses dados, em uma outra tabela, só que tenho que ir somando o tempo de cada serviço e comparar se nao vai ultrapassar o tempo diario da categoria, e acrescentando a data pra ser feito esse serviço. (só que eu tinha ficar verificando esse tempo linha por linha do resultado da sql) tipo a categoria X tem 100 min por dia, e os dois primeiros serviço já derem 100 min, os proximos serviços serao alocados com a data do outro dia, e assim por diante. Bom acho que é isso. nao sei como faço isso, se uma select faz essas coisas ou tenho que montar algum loop no delphi, ou se tenho que montar uma procedure no Oracle, pra ficar lendo as linhas dos registros. Obrigado.
[oracle_br] Re: Delphi e oracle
Valeu galera, eu coloquei um count dentro da select que ja deu certo. obrigado. --- Em oracle_br@yahoogrupos.com.br, Márcio Ricardo <[EMAIL PROTECTED]> escreveu > > A sua consulta deve estar errada, pois eu utilizo essa propriedade e ela me traz a quantidade correta... > Posta o seu codigo aqui para analizarmos. > - Original Message - > From: rzzanatta > To: oracle_br@yahoogrupos.com.br > Sent: Monday, May 14, 2007 1:29 PM > Subject: [oracle_br] Delphi e oracle > > > Olá gostaria de saber como faço para que em uma consulta de registros, > me traga a quantidade dos registros encontrados? > > pois no delphi, usando a propriedade "RecordCount" na query ele só me > traz o numero -1. > > > > > > [As partes desta mensagem que não continham texto foram removidas] >
[oracle_br] Delphi e oracle
Olá gostaria de saber como faço para que em uma consulta de registros, me traga a quantidade dos registros encontrados? pois no delphi, usando a propriedade "RecordCount" na query ele só me traz o numero -1.
[oracle_br] Re: Resto da divisao
Obrigado, tinha me esquecido disso.rsrsrs Valeu --- Em oracle_br@yahoogrupos.com.br, "Alex Fernando Kirsten" <[EMAIL PROTECTED]> escreveu > > trunc(13/2,0) > > []'s > > Alex Fernando Kirsten > Oracle 9i Database Administrator Certified Professional > Depto. de Tecnologia > Operacional Têxtil > > - Original Message - > From: rzzanatta > To: oracle_br@yahoogrupos.com.br > Sent: Tuesday, May 08, 2007 2:20 PM > Subject: [oracle_br] Resto da divisao > > > Olá galera eu sei que pra mim pegar o resto da divisao é só fazer > mod(13,2) que é 1, mas como pego só a parte inteira da divisao que > neste caso seria 2? > > > > > > [As partes desta mensagem que não continham texto foram removidas] >
[oracle_br] Resto da divisao
Olá galera eu sei que pra mim pegar o resto da divisao é só fazer mod(13,2) que é 1, mas como pego só a parte inteira da divisao que neste caso seria 2?
[oracle_br] select
Olá estou com problema e nao consigo pensar direito, parece simples, acho. tenho uma tabela no oracle nela tenho mensagens pra aparecer na nota fiscal apartir dos codigos dos produtos, ex: codigo | grupo | mensagem 01 4.3.07 ICMS RETIDO 02 4.3.08 ICMS RETIDO 03 4.3.01.08ISENTO ... SE EU FATURAR OS PRODUTOS 4.3.07 E 4.3.08 NA MESMA NOTA EU QUERIA QUE APARECESSE SOMENTE UMA MENSAGEM NA NOTA, NAO DUAS. COMO FAÇO ISSO? MINHA SELECT É ESSA. SELECT GRUPO FROM TESTE WHERE GRUPO IN ('4.3.01.07','4.3.01.08') (ASSIM ELE TRAZ DOIS RESULTADOS NESSA NOTA E EU SÓ QUERO UM)