Jump to content
MarcosAntonio

Manipulação e leitura campo blob

Recommended Posts

Boa tarde !
estou carregando um arquivo texto numa variável BLOB e preciso manipular em loop, para ler linha a linha e aplicar os SUBSTRs para inserir no banco, mas não sei como fazer o loop, a interação entre as linhas e quando saber o momento de sair do loop, alguém pode me ajudar?

ex do conteúdo do BLOB:

 

2AAA02012021123421

2AAA02012021213453

2AAA02012021105413

 

quero por exemplo retirar a informação da linha 2 a partir do quarto caracter e parando no decimo segundo caracteres

Share this post


Link to post
Share on other sites

Sua pergunta me parece muito genérica.

Todavia , segue um exemplo que uso para emails 

 

create or replace PROCEDURE ENVIA_EMAIL_BLOB (...
                                              p_attach_blob IN BLOB DEFAULT NULL,
                                              ...)
AS
  l_step        PLS_INTEGER  := 12000; -- make sure you set a multiple of 3 not higher than 24573
BEGIN
    ...
    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_attach_blob) - 1 )/l_step) LOOP
      UTL_SMTP.write_data(l_mail_conn, UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_attach_blob, l_step, i * l_step + 1))));
    END LOOP;
    ...
END;

A documentação da Oracle é farta em exemplos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By ldblucas
      Boa tarde,
       
      Atualmente qual a melhor formar de fazer um conexao C# com o banco Oracle ?
       
       
       
      desde já agradeço
    • By mr22robot
      select A.CODPROD,A.DESCRICAO,A.DTMOVLOG DATA,A.NUMNOTA,ROUND(A.QT,2)QTDE,A.PUNIT,A.NOMECODOPER OPERACAO,ROUND(A.P_TOTAL,2)P_TOTAL, (SELECT QTEST - PCEST.QTRESERV QTEST FROM PCEST WHERE CODFILIAL = 1 AND CODPROD = A.CODPROD)QTESTOQUE FROM( SELECT PCMOV.CODPROD,PCMOV.DESCRICAO, TRUNC(PCMOV.DTMOV) DTMOV, PCMOV.DTMOVLOG, PCMOV.NUMNOTA, PCMOV.NUMSEQ, PCMOV.NUMSEQPED, PCMOV.NUMTRANSENT, PCMOV.DTCANCEL, DECODE(DTCANCEL,NULL,'','Cancelado') SITUACAO, PCMOV.CODUSUR, PCMOV.NUMTRANSVENDA, PCMOV.NUMCAR, PCMOV.NUMLOTE, PCMOV.CODFISCAL, NVL(PCMOV.CUSTOREAL,0) CUSTOREAL, NVL(PCMOV.CUSTOFIN,0) CUSTOFIN, (CASE WHEN (SUBSTR(PCMOV.CODOPER,1,1) = 'E') THEN NVL(PCMOV.CUSTOFIN,0) ELSE NVL(PCMOV.CUSTOFINEST,0) END) CUSTOFINEST, NVL(PCMOV.CUSTOULTENT,0) CUSTOULTENT, NVL(PCMOV.CUSTOFORNEC,0) CUSTOFORNEC, NVL(PCMOV.CUSTOCONT,0) CUSTOCONT, DECODE(PCMOV.CODOPER, 'E',PCMOV.CODFORNEC, 'EB',PCMOV.CODFORNEC, 'ET',PCMOV.CODFORNEC, 'ER',PCMOV.CODFORNEC, 'ES',PCMOV.CODFORNEC, PCMOV.CODCLI) CODCLI, NVL(PCMOV.CODFUNCLANC,0) AS CODFUNCLANC, DECODE(SUBSTR(PCMOV.CODOPER, 1, 1), 'S',(PCMOV.QT * (-1)), 'R',(PCMOV.QT * (-1)), DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) AS QT, NVL(PCMOV.PUNIT,0) PUNIT, PCMOV.CODOPER, DECODE(PCMOV.CODOPER, 'E', DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Cancelada','Entrada Merc.'), 'EB',DECODE(GREATEST(PCMOV.QT,0),0,'Bonif. Cancelada','Entrada Bonific.'), 'ET',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Transf. Cancelada','Entrada Transf.'), 'EA',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Ajuste Cancelada','Ajuste Estoque'), 'E1',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Avaria Cancelada','Entrada Avaria'), 'EI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'ED',DECODE(GREATEST(PCMOV.QT,0),0,'Devolução Cancelada','Dev. Cliente'), 'EN',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Venda Consig. Cancelada','Dev. Venda Consignada'), 'ER',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'ES',DECODE(GREATEST(PCMOV.QT,0),0,'Sobra Mercadoria Cancelamento','Sobra de Mercadoria'), 'EM',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Mat. Consumo Cancelada','Entrada Materiais de Consumo'), 'EC',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Consig. Cancelada','Entrada Consignação'), 'EO',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Cancelada','Devolução de Comodato'), 'EX',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Avulsa Cancelada','Devolução Avulsa'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Benefic. Cancelada','Entrada de Beneficiamento'), 'S', DECODE(GREATEST(PCMOV.QT,0),0,'NF Cancelada','Saida'), 'SD',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Cancelada','Dev. Fornecedor'), 'SB',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Bonific. Cancelada','Saida Bonific.'), 'ST',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Transf. Cancelada','Saida Transf.'), 'S1',DECODE(GREATEST(PCMOV.QT,0),0,'Avaria Reaprov. Cancelada','Avaria por Reaproveitamento'), 'SS',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Sobra Cancelada','Saída de Sobra'), 'SA',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Ajuste Cancelada','Ajuste Estoque'), 'SI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'SR',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'SC',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Consig. Cancelada','Saída Consignação'), 'SO',DECODE(GREATEST(PCMOV.QT,0),0,'Remessa Comodato Cancelada','Remessa de Comodato'), 'SF',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Fornec. Cancelada','Devolução de Comodato a Fornecedor'), 'RA',DECODE(GREATEST(PCMOV.QT,0),0,'Req. Avulsa Cancelada','Requisição Avulsa'), 'EP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Entrada Produção'), 'SP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Requisição Mat.Prima'), 'SV',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Avaria Cancelada','Saída por Avaria'), 'SM',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Mat. Consumo Cancelada','Saída Materiais de Consumo'), 'SL',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Perda Cancelada','Saída de Perda'), 'EL',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Perda Cancelada','Entrada de Perda'), 'EF',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Comodato Cancelada','Entrada de Comodato'), 'SN',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Benefic. Cancelada','Saída de Beneficiamento'), 'EV',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Dev. Rem. Benefic. Cancelada','Entrada Devolução de Remessa para Beneficiamento'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Benefic. Cancelada','Entrada de Beneficiamento'), 'Desconhecido') NOMECODOPER, (NVL(PCMOV.PUNIT,0)*DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) P_TOTAL, (CASE WHEN PCMOV.CODOPER IN ('SA', 'EA') THEN (SELECT DISTINCT HISTORICO FROM PCLANC WHERE NUMTRANSENT = PCMOV.NUMTRANSENT AND ROWNUM = 1) ELSE ' ' END) MOTIVO FROM PCMOV, PCPRODUT, PCMOVCOMPLE WHERE PCMOV.CODPROD IN(SELECT CODPROD FROM PCPRODUT WHERE CODSEC IN(10020)) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCMOV.NUMTRANSITEM = PCMOVCOMPLE.NUMTRANSITEM(+) AND NVL(PCMOVCOMPLE.MOVEST, 'S') = 'S' AND PCMOV.DTMOV BETWEEN '01-JAN-2020' AND '29-SEP-2021' AND NVL(PCMOV.CODFILIALNF, PCMOV.CODFILIAL) = '1' AND PCMOV.CODOPER <> 'S' AND ((NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'S' AND PCMOV.NUMLOTE IS NOT NULL) OR (NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'N' AND PCMOV.NUMLOTE IS NULL)) AND PCMOV.STATUS IN ('B','AB') AND NOT EXISTS (SELECT DISTINCT (PCNFSAID.NUMTRANSVENDA) FROM PCNFSAID, PCPRODUT WHERE PCNFSAID.NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND PCNFSAID.CODFILIAL = PCMOV.CODFILIAL AND PCMOV.CODOPER = 'S' AND PCNFSAID.CONDVENDA IN (4, 7, 14) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCPRODUT.TIPOMERC = 'CB') AND NOT (FERRAMENTAS.F_BUSCARPARAMETRO_ALFA('DEVOLVESIMPLESREMTV13TOTAL',PCMOV.CODFILIAL,'N') = 'S' AND PCMOV.ROTINACAD LIKE '%1332%' AND NVL(PCMOVCOMPLE.QTRETORNOTV13,0) = 0) AND NOT EXISTS (SELECT NUMNOTA FROM PCNFSAID WHERE NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND SITUACAONFE IN (110,205,301,302,303)) ORDER BY PCMOV.CODOPER, PCMOV.DTMOV, PCMOV.NUMNOTA )A WHERE A.DTCANCEL IS NULL AND A.CODOPER = 'E' ORDER BY CODPROd,DATA Boa tarde. Estou com essa dúvida:
      Preciso em um select trazer os dados com a seguinte condição: 
      Quando  o valor do punit repetir, somente traz o ultimo registro. ou seja a maior data. 
      caso contrário, traz todos os registros. 
      é possíveç, mais não sei como. Tentei usar o ROW_NUMBER(). Mas não encontrei uma forma de usar. 
      Greato
    • By Priscila1307
      CREATE TABLE CLIENTE( Idcliente int, nome varchar(60), dtnascimento date, cpf varchar(11), CONSTRAINT pk_cliente PRIMARY KEY (Idcliente) ); CREATE TABLE PEDIDO( Idpedido int, Idcliente int, datapedido date, vltotal decimal(10,2), CONSTRAINT pk_pedido PRIMARY KEY (Idpedido), CONSTRAINT fk_pedido_cliente FOREIGN KEY (Idcliente) REFERENCES CLIENTE(Idcliente) ); CREATE TABLE PRODUTO( Idproduto int, descricao varchar(100), quantidade int, CONSTRAINT pk_produto PRIMARY KEY (Idproduto) ); CREATE TABLE ITEMPEDIDO( Idpedido int, Nritem int, valor decimal(10,2), quantidade int, Idproduto int, CONSTRAINT pk_itempedido PRIMARY KEY (Idpedido, Nritem), CONSTRAINT fk_Idpedido FOREIGN KEY (Idpedido) REFERENCES PEDIDO (Idpedido), CONSTRAINT fk_itempedido_produto FOREIGN KEY (Idproduto) REFERENCES PRODUTO (Idproduto) ); CREATE TABLE LOG( Idlog int, data date, descricao varchar(255), CONSTRAINT pk_log PRIMARY KEY (Idlog) ); INSERT INTO CLIENTE VALUES (1, 'Hugo Batista', TO_DATE('05/02/1990', 'DD/MM/YYYY'), '51898608253'); INSERT INTO CLIENTE VALUES (2, 'José Antonio', TO_DATE('02/05/1985', 'DD/MM/YYYY'), '51144722241'); INSERT INTO CLIENTE VALUES (3, 'João Carlos', TO_DATE('03/05/1993', 'DD/MM/YYYY'), '84882273292'); INSERT INTO CLIENTE VALUES (4, 'Edivaldo Santana', TO_DATE('01/06/2000', 'DD/MM/YYYY'), '30609426176'); INSERT INTO CLIENTE VALUES (5, 'Cristina Oliveira', TO_DATE('16/08/1999', 'DD/MM/YYYY'), '56313586700'); INSERT INTO CLIENTE VALUES (6, 'Artur da Silva', TO_DATE('06/05/2001', 'DD/MM/YYYY'), '67491246583'); INSERT INTO CLIENTE VALUES (7, 'Adrina Domingues', TO_DATE('01/02/1972', 'DD/MM/YYYY'), '22044617250'); INSERT INTO PRODUTO VALUES (1, 'SAMSUNG J7 - PRIME', 10); INSERT INTO PRODUTO VALUES (2, 'SAMSUNG J5 - PRIME', 10); INSERT INTO PRODUTO VALUES (3, 'IPHONE X', 10); INSERT INTO PRODUTO VALUES (4, 'MOTO G 5S', 10); INSERT INTO PRODUTO VALUES (5, 'IPHONE 6S', 10); INSERT INTO PEDIDO VALUES (1, 4, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1400.99); INSERT INTO ITEMPEDIDO VALUES (1, 1, 800.99, 1, 1); INSERT INTO ITEMPEDIDO VALUES (1, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (2, 2, TO_DATE('17/03/2018', 'DD/MM/YYYY'), 1349.50); INSERT INTO ITEMPEDIDO VALUES (2, 1, 749.50, 1, 4); INSERT INTO ITEMPEDIDO VALUES (2, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (3, 1, TO_DATE('20/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (3, 1, 1800.71, 1, 5); INSERT INTO ITEMPEDIDO VALUES (3, 2, 789.39, 1, 4); INSERT INTO PEDIDO VALUES (4, 5, TO_DATE('21/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (4, 1, 5099.00, 1, 3); INSERT INTO PEDIDO VALUES (5, 7, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1800.00); INSERT INTO ITEMPEDIDO VALUES (5, 1, 600.00, 3, 2); "Crie um select que exibe quais são os três PRODUTOS com a maior quantidade de PEDIDOS. Exiba o nome e o código do produto"
       
      Oi pessoal. por favor preciso da ajuda de vocês . 
      Eu queria criar um SELECT que exiba os três PRODUTOS com a maior quantidade de PEDIDOS.
      Retornando nome do produto ( PRODUTO.DESCRICAO )  e  o código dele ( PRODUTO.IDPRODUTO )
       
      Eu tentei das seguintes formas mas não consegui . estou novinha ainda em oracle
       
       
      SELECT PRODUTO.DESCRICAO, PRODUTO.IDPRODUTO, ITEMPEDIDO.QUANTIDADE FROM ITEMPEDIDO, PEDIDO, PRODUTO WHERE ITEMPEDIDO.IDPEDIDO = PEDIDO.IDPEDIDO AND PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO GROUP BY IDPRODUTO  
      neste código só roda sem erro se eu tirar o GROUP BY IDPRODUTO.  Mas não gera o resultado esperado 

       
      SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC  
       
      Aqui eu até consegui chegar perto mas não consegui acrescentar o nome do produto ( que é PRODUTO.DESCRICAO) e o produto com idproduto 2 ( que é o J5 ) não são só 3 vendidos. SÃO 5 !!! ai ai ai ai
       
      ....e apos muita batalha eu consegui fazer isso ... que tbm ainda não é o ideal
       
      SELECT * FROM (SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC) WHERE ROWNUM <4  

       
      ... demorei horrores pra fazer esse WHERE ROWNUM <4  rodar sem erro... pois é pessoal. só historia triste ! kkkkk
       
       
      Agora estou tentando esse aqui mas não terminei 
       
      SELECT PRODUTO.DESCRICAO AS NOME, ITEMPEDIDO.IDPRODUTO FROM PRODUTO, ITEMPEDIDO WHERE PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO
       
       
      acabei parando no meio do caminho e decidi recorrer ao imasters ! 
       
      vou continuar tentando ... sera que consigo antes de alguem aparecer aqui ? rsrsrs
       
      obrigada ! boa sorte pessoal.
       
       
       
      ah ! já ia esquecendo estou usando o livesql.oracle.com
       
      e vou deixar aqui tbm a consulta das tabelas 
       
       

    • By gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
    • By gamesmax2
      Boa tarde,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome ORDER BY having status = 'Ok'  
       
×

Important Information

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