PL/SQL: ORA-00984 - Ajuda

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Boa tarde pessoal.

Estou com um probleminha em uma procedure e queria a ajuda de vocês.

Quando mando compilar a procedure abaixo, o oracle me mostra o seguinte erro:

160/30 PLS-00302: component 'NUM_LANCAMENTO' must be declared
160/30 PL/SQL: ORA-00984: column not allowed here
126/18 PL/SQL: SQL Statement ignored


Acontece que eu estou usnado ALIAS para alguns resultados do meu select na construção do cursor e não posso fazer de outra maneira, ou, não sei como fazer.

alguém tem uma luz, por favor?

Selecionar tudo

create or replace
PROCEDURE PROC_SAFX01_SPED    

IS
 
      --- Inicio o cursor
cursor C_CUR is 
                     SELECT     
                                CASE        
                                WHEN header.LEDGER_ID = 2043 then '017'        
                                WHEN header.LEDGER_ID = 2021 then '019'        
                                WHEN contas.SEGMENT1 = '1020' THEN '007'        
                                WHEN contas.SEGMENT1 = '1019' THEN '007'        
                                WHEN contas.SEGMENT1 = '1021' THEN '007'        
                                WHEN contas.SEGMENT1 = '1018' THEN '007'        
                                WHEN contas.SEGMENT1 = '1017' THEN '007'        
                                WHEN contas.SEGMENT1 = '1016' THEN '007'        
                                WHEN contas.SEGMENT1 = '1015' THEN '007'        
                                WHEN contas.SEGMENT1 = '1028' THEN '007'        
                                WHEN contas.SEGMENT1 = '1024' THEN '007'        
                                WHEN contas.SEGMENT1 = '1030' THEN '007'        
                                WHEN contas.SEGMENT1 = '1032' THEN '007'        
                                WHEN contas.SEGMENT1 = '1031' THEN '007'        
                                WHEN CONTAS.SEGMENT1 = '0002' THEN '007'        
                                END                                                 "cod_empresa"       --01        
                                ,CASE    
                                WHEN contas.SEGMENT2 = '0007' THEN '001'        
                                WHEN contas.SEGMENT2 = '0010' THEN '002'        
                                WHEN contas.SEGMENT2 = '0013' THEN '003'        
                                WHEN contas.SEGMENT2 = '0012' THEN '004'        
                                WHEN contas.SEGMENT2 = '0011' THEN '005'        
                                WHEN contas.SEGMENT2 = '0014' THEN '006'       
                                WHEN contas.SEGMENT2 = '0033' THEN '007'        
                                WHEN contas.SEGMENT2 = '0008' THEN '001'        
                                WHEN contas.SEGMENT2 = '0009' THEN '002'        
                                WHEN contas.SEGMENT2 = '1020' THEN '003'        
                                WHEN contas.SEGMENT2 = '1019' THEN '004'        
                                WHEN contas.SEGMENT2 = '1021' THEN '005'        
                                WHEN contas.SEGMENT2 = '1018' THEN '006'        
                                WHEN contas.SEGMENT2 = '1017' THEN '007'        
                                WHEN contas.SEGMENT2 = '1016' THEN '008'        
                                WHEN contas.SEGMENT2 = '1015' THEN '009'        
                                WHEN contas.SEGMENT2 = '1028' THEN '010'        
                                WHEN contas.SEGMENT2 = '1024' THEN '011'        
                                WHEN contas.SEGMENT2 = '1030' THEN '014'        
                                WHEN contas.SEGMENT2 = '1032' THEN '017'        
                                WHEN contas.SEGMENT2 = '1031' THEN '019' 
                                WHEN contas.segment2 = '0002' THEN '001'        
                                END                                                                             "cod_estab"         --02        
                                ,'20' || SUBSTR (header.default_effective_date,7,2) || SUBSTR (header.default_effective_date,4,2) || SUBSTR (header.default_effective_date,1,2)  "data_operacao"     --03        
                                ,contas.SEGMENT4                                                                "conta_deb_cred"    --04        
                                ,CASE        
                                WHEN linhas.ACCOUNTED_DR < 0 THEN 'C'        
                                WHEN linhas.ACCOUNTED_CR < 0 THEN 'D'        
                                WHEN linhas.ACCOUNTED_DR = 0 THEN 'C'        
                                WHEN linhas.ACCOUNTED_CR = 0 THEN 'D'        
                                end                                                                             "ind_deb_cre"       --05        
                                ,lote.je_batch_id                                                               "je_batch_id"
                                ,header.je_header_id                                                            "je_header_id"
                                ,linhas.JE_LINE_NUM                                                             "JE_LINE_NUM"                
                                ,CASE        
                                WHEN linhas.ACCOUNTED_DR = 0 then REPLACE (REPLACE (REPLACE (to_char (linhas.ACCOUNTED_CR,'000000000000000.99'),'.',''),'-',''),' ','')        
                                WHEN linhas.ACCOUNTED_CR = 0 then REPLACE (REPLACE (REPLACE (to_char (linhas.ACCOUNTED_DR,'000000000000000.99'),'.',''),'-',''),' ','')        
                                end                                                                             "vlr_lancto"        --07        
                                ,'@'                                                                            "contra_part"       --08        
                                ,contas.SEGMENT3                                                                "centro_custo"      --09        
                                ,'@'                                                                            "centro_despesa"    --10        
                                ,'@'                                                                            "histpadrao"        --11        
                                ,NULL                                                                           "cod_operacao"      --12        
                                ,LINHAS.DESCRIPTION                                                             "histcompl"         --13        
                                ,header.je_header_id                                                            "num_lancamento"    --14              
                        
                        FROM
                        
                        (
                        select
                               LEDGER_ID      
                              ,case when ACCOUNTED_DR IS NULL then 0 ELSE ACCOUNTED_DR end "ACCOUNTED_DR"
                              ,case when ACCOUNTED_CR IS NULL then 0 ELSE ACCOUNTED_CR end "ACCOUNTED_CR"     
                              ,je_header_id      
                              ,DESCRIPTION      
                              ,CODE_COMBINATION_ID
                              ,JE_LINE_NUM
                        from apps.gl_je_lines
                        ) linhas,
                        
                        (
                        select
                               CODE_COMBINATION_ID      
                              ,SEGMENT1      
                              ,SEGMENT2      
                              ,SEGMENT3
                              ,SEGMENT4
                        from APPS.GL_CODE_COMBINATIONS
                        ) contas,
                        
                        (
                        select      
                               LEDGER_ID      
                              ,je_header_id      
                              ,default_effective_date      
                              ,PERIOD_NAME
                              ,je_batch_id
                        from apps.gl_je_headers
                        ) header,
                        
                        (
                        select 
                               je_batch_id
                        from APPS.GL_JE_BATCHES
                        ) lote
                        
                        WHERE 1 = 1
                        AND linhas.LEDGER_ID                = header.LEDGER_ID
                        AND linhas.je_header_id             = header.je_header_id
                        and header.je_batch_id              = lote.je_batch_id
                        AND linhas.CODE_COMBINATION_ID      = contas.CODE_COMBINATION_ID
                        AND  HEADER.JE_HEADER_ID            = 12914432
                        AND header.LEDGER_ID                = 2043 --in (2063,2473,2433,2513,2413,2453,2493,2533,2155,2153,2157,3173,3193)
                        AND HEADER.PERIOD_NAME              = 'JUN-11'
                     ;
                    
  BEGIN
  
  for C_CUR2 IN C_CUR  LOOP
        
                 INSERT INTO SAFX01_SPED
                   (
                      cod_empresa      
                     ,cod_estab        
                     ,conta_deb_cred   
                     ,ind_deb_cre      
                     ,je_batch_id    
                     ,je_header_id     
                     ,JE_LINE_NUM       
                     ,vlr_lancto     
                     ,contra_part    
                     ,centro_custo   
                     ,centro_despesa  
                     ,histpadrao    
                     ,cod_operacao   
                     ,histcompl    
                     ,num_lancamento  
                       ) 
                       VALUES
                    (
                      C_CUR2.cod_empresa      
                     ,C_CUR2.cod_estab       
                     ,C_CUR2.conta_deb_cred   
                     ,C_CUR2.ind_deb_cre      
                     ,C_CUR2.je_batch_id    
                     ,C_CUR2.je_header_id     
                     ,C_CUR2.JE_LINE_NUM       
                     ,C_CUR2.vlr_lancto      
                     ,C_CUR2.contra_part     
                     ,C_CUR2.centro_custo    
                     ,C_CUR2.centro_despesa  
                     ,C_CUR2.histpadrao      
                     ,C_CUR2.cod_operacao    
                     ,C_CUR2.histcompl      
                     ,C_CUR2.num_lancamento
                     );                   
                    commit; 
      end LOOP;

END PROC_SAFX01_SPED;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Tente retirar os "".

Outra coisa, não use commit uma vez por linha. Cada commit executado faz com que o banco tenha que finalizar uma transação e iniciar outra, gerando log desnecessário.

O ideal é que quem deveria dar o commit é quem chamou a procedure, e não ela própria.

Mais uma sugestão: não há motivo para fazer um cursor loop nesse caso dessa procedure, você pode resolver direto num insert .. select, num único comando.

Selecionar tudo

INSERT INTO SAFX01_SPED
                   (
                      cod_empresa     
                     ,cod_estab       
                     ,conta_deb_cred   
                     ,ind_deb_cre     
                     ,je_batch_id   
                     ,je_header_id     
                     ,JE_LINE_NUM       
                     ,vlr_lancto     
                     ,contra_part   
                     ,centro_custo   
                     ,centro_despesa 
                     ,histpadrao   
                     ,cod_operacao   
                     ,histcompl   
                     ,num_lancamento 
                       ) SELECT   ...  (copiar o select do seu cursor)

Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Complementando a questão do commit, além de ser "ruim" para o banco de dados, a performance da procedure ficará muito pior fazendo commit linha a linha, pois cada commit obriga o Oracle a gravar fisicamente em disco suas alterações no redo log.
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Pessoal,

muito obrigado. Vou fazer como orientaram...

qualquer coisa, eu posto aqui novamente!

Abraços
Responder
  • Informação