SELECT inside a FOR in declare SQL/ORACLE

Asked

Viewed 1,805 times

0

I need to generate an excel of a table data but I need to do for each my company, so n have to run select changing the company id I thought to do with Procedure but the ones I have and just update and Insert I thought the logic would be the same but not this flowing. Bs do not need to pass parameter.

DECLARE

v_nome_empresa VARCHAR2(50);

CURSOR v_empresas IS SELECT  * FROM cf_empresa emp WHERE emp.ID_ADMINISTRACAO = 298;

BEGIN   

  FOR v_empresa IN v_empresas LOOP

  SELECT emp.RAZAO_SOCIAL
        INTO v_nome_empresa
                from EST_PRODUTO_ESTOQUE prodEstoque
                inner join EST_PRODUTO produto on prodEstoque.ID_PRODUTO = produto.ID_PRODUTO
                inner join EST_FORNECEDOR forn on produto.ID_FORNECEDOR = forn.ID_FORNECEDOR 
                inner join CF_EMPRESA emp on prodEstoque.ID_EMPRESA = emp.ID_EMPRESA
                where forn.ID_FORNECEDOR = 99205390 or forn.ID_FORNECEDOR = 106534020 AND v_empresa.ID_EMPRESA = emp.ID_EMPRESA

dbms_output.put_line('Nome empresa '|| v_nome_empresa);
  END LOOP;

END;

returned error :

 Relatório de erros -
ORA-06550: linha 19, coluna 2:
PL/SQL: ORA-00933: comando SQL não encerrado adequadamente
ORA-06550: linha 11, coluna 5:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

What a way I can do that?

  • 1

    Seems to be missing a ';' at the end of SELECT INTO.

  • n was that Bruno

  • 1

    Doesn’t say anything else about the error? Doesn’t point a line or anything, or even an error code?

  • this on the new Edit

  • @Guilhermeoliveira the select needs to be inside a block BEGIN END I believe that caused the error

1 answer

1


DECLARE

  vf_Arquivo      SYS.UTL_FILE.FILE_TYPE;
  vs_caminho      varchar2(25);
  vs_arquivo      varchar2(50);
  vs_linha        varchar(4000);
  CR              CHAR(1) := Chr(13);--CARRIEGE RETURN

BEGIN   
  vs_caminho := '... utl ...';--DIRETORIO PASTA UTL_FILE

  FOR REMP IN (SELECT ID_EMPRESA FROM cf_empresa emp WHERE emp.ID_ADMINISTRACAO = 298)
  LOOP
    --ABRIR ARQUIVO
    vs_arquivo := 'CSV_' || REMP.ID_EMPRESA || '.CSV';
    VF_ARQUIVO := SYS.UTL_FILE.FOPEN(VS_CAMINHO,VS_ARQUIVO,'w');
    --FORS
    FOR RPROD IN (SELECT  EMP.ID_EMPRESA , emp.RAZAO_SOCIAL 
                  from EST_PRODUTO_ESTOQUE prodEstoque
                    inner join EST_PRODUTO produto on prodEstoque.ID_PRODUTO = produto.ID_PRODUTO
                    inner join EST_FORNECEDOR forn on produto.ID_FORNECEDOR = forn.ID_FORNECEDOR 
                    inner join CF_EMPRESA emp on prodEstoque.ID_EMPRESA = emp.ID_EMPRESA
                    where forn.ID_FORNECEDOR = 99205390 or forn.ID_FORNECEDOR = 106534020 AND EMP.ID_EMPRESA = REMP.ID_EMPRESA)
    LOOP
      --MONTA E ESCREVE ESCREVE LINHA
      vs_linha := RPROD.ID_EMPRESA ||';'||RPROD.RAZAO_SOCIA||CR;  
      SYS.UTL_FILE.put_line(vf_arquivo,vs_linha||CR);
    END LOOP;
    --FECHA ARQUIVO
    SYS.UTL_FILE.fclose(vf_arquivo);
  END LOOP;

END;

go inside for

presupposes the existence of UTL defined , no chance to test , but follows the logic of thing I do to generate csv s

this is for very large sqls would not be recommended

  • From forum.imasters to here you come saving vlw Motta.

  • :) .................

Browser other questions tagged

You are not signed in. Login or sign up in order to post.