Неверное имя переменной хоста / связывания ORA-01745 - PullRequest
1 голос
/ 28 апреля 2020

Здравствуйте, у меня есть эта ошибка:

Недопустимое имя переменной хоста / связывания ORA-01745 в строке 47 Ошибка при второй вставке (вставка в TPILVALEUR)

при использовании процедуры ниже я знаю, что это происходит, когда мы используем переменную Oracle в запросе, но я не использую ее (я думаю, в моих запросах), я не знаю, где он нашел ключевое слово Oracle в моем запросе вставки ...

create or replace
procedure computePilotageLFIICHN (pCampagne in number)
as 

  cSep                     constant varchar2(1)  := ':';            
  cCodeGeoTableauDep       constant varchar2(3)  := 'DEP';
  cCodeGeoTableauReg       constant varchar2(3)  := 'REG';
  cCodeGeoTableauNat       constant varchar2(3)  := 'NAT'; 

  cCodeTypeTableauCourant  constant varchar2(12) := 'LFI_ICHN';
  cCodeColTheorie          constant varchar2(30) := 'LFI_ICHN_THEORIE';
  cCodeColDosAvecLet       constant varchar2(30) := 'LFI_ICHN_DOS_AVEC_LFI';
  cCodeColAEditer          constant varchar2(30) := 'LFI_ICHN_A_EDITER';
  cCodeColAReediter        constant varchar2(30) := 'LFI_ICHN_A_REEDITER';
  cCodeColEditees          constant varchar2(30) := 'LFI_ICHN_EDITEES';

  idTypeDemd               constant varchar2(12) := '20.2010';
  lDateDebut               timestamp;
  lTempsExec               varchar2(29);
  cNbEtapes                constant number := 5;
  lEtapeCur                 number := 0;  
begin
  PCKISISLOGGER.logavancement('Début Calcul Pilotage LFI ICHN');

  pilSupprimerTdB(cCodeTypeTableauCourant,pCampagne);
  pilInitialiserTdB(cCodeTypeTableauCourant,pCampagne);

  EXECUTE IMMEDIATE 'create global temporary table TPILTMPLFIICHN'||pCampagne||' As SELECT * from TPILTMPLFIICHN';
  EXECUTE IMMEDIATE 'insert into TPILTMPLFIICHN'||pCampagne||'(CODEDDAF,NUMEROPACAGE,CAMPAGNE) (select CODEDDAF,NUMEROPACAGE,CAMPAGNE from TPILTMPLFIICHN)';

  EXECUTE IMMEDIATE 'TRUNCATE TABLE TPILTMPLFIICHN'||pCampagne;

  EXECUTE IMMEDIATE 'INSERT INTO TPILTMPLFIICHN'||pCampagne||'(codeDdaf, numeroPacage, campagne)
                     SELECT distinct sousReq.codeDdaf, sousReq.numeroPacage, '||pCampagne||'
                     FROM ( 
                             SELECT  dos.CODEDDAF codeDdaf, dos.numeropacage numeroPacage 
                             FROM TSRFDOSSIERSURFACE dos,TSRFDEMANDEAIDE dem, TVSFDOSSIERVALORISATION2P dvn
                             WHERE dem.IDTYPEDEMANDEAIDE = '||idTypeDemd||'
                             AND dem.IDDOSSIERSURFACE = dos.IDDOSSIERSURFACE
                             AND dos.campagne = '||pCampagne||' AND dos.DATEDERNIEREEVALUATION > dos.DATEDERNIEREMODIF and dos.DOSSIERMODIFIEAREEVALUER = 0
                             AND dem.DATEDERNIEREEVALUATION > dem.DATEDERNIEREMODIFICATION and dem.DOSSIERMODIFIEAREEVALUER = 0
                             AND dvn.ELIGIBLELFI = 1) sousReq';


  -- Nombre de destinataires theoriques distincts
  lEtapeCur := lEtapeCur + 1;
  PCKISISLOGGER.logavancement('Etape ' || lEtapeCur || '/' || cNbEtapes || ' : Calcul du Nombre de destinataires théoriques distincts');
  EXECUTE IMMEDIATE 'insert into TPILVALEUR (idValeur, idTableauDeBord, codeLigne, codeColonne, valeur)
                              SELECT 
                                  tab.idTableauDeBord || '||cSep||' || tmpLfi.codeDdaf || '||cSep||' || '||cCodeColTheorie||',  
                                  tab.idTableauDeBord,
                                  tmpLfi.codeDdaf,
                                  '||cCodeColTheorie||',
                                  count(distinct tmpLfi.numeroPacage)
                              FROM
                                  TPILTABLEAUDEBORD tab,
                                  TPILTMPLFIICHN'||pCampagne||' tmpLfi   
                                 WHERE 
                                    tab.campagne = '||pCampagne||'
                                    AND tmpLfi.campagne = '||pCampagne||'
                                    AND tab.codeTypeTableauDeBord = '||cCodeTypeTableauCourant||'
                                    AND tmpLfi.codeDdaf = 
                                    case 
                                    when tab.codeTypeGeoTableauDeBord = '||cCodeGeoTableauDep||' then tab.codeDepartement
                                    when tab.codetypegeotableaudebord = '||cCodeGeoTableauReg||' and EXISTS(SELECT 1 FROM trefdepartement dept WHERE dept.code = tmpLfi.codeDdaf AND dept.codeRegion = tab.codeRegion) then tmpLfi.codeDdaf       
                                    when tab.codetypegeotableaudebord = '||cCodeGeoTableauNat||' then tmpLfi.codeDdaf
                                    end
                                GROUP BY
                                  tab.idTableauDeBord,
                                  tmpLfi.codeDdaf';



  EXECUTE IMMEDIATE 'drop table TPILTMPLFIICHN'||pCampagne;

  PCKISISLOGGER.logavancement('Fin Calcul Pilotage LFI ICHN');

end computePilotageLFIICHN; 
/

Спасибо

1 Ответ

1 голос
/ 28 апреля 2020

Поскольку вам нужно больше кавычек, чтобы получить литералы для большинства локальных переменных в операторе INSERT, таких как

 EXECUTE IMMEDIATE 
'INSERT INTO TPILVALEUR (idValeur, idTableauDeBord, codeLigne, codeColonne, valeur)
 SELECT 
        tab.idTableauDeBord || '''||cSep||''' || tmpLfi.codeDdaf || '''||cSep||''' || '''||cCodeColTheorie||''',  
        tab.idTableauDeBord,
        tmpLfi.codeDdaf,
        '''||cCodeColTheorie||''',
        COUNT(DISTINCT tmpLfi.numeroPacage)
   FROM
        TPILTABLEAUDEBORD tab
   JOIN
        TPILTMPLFIICHN'||pCampagne||' tmpLfi 
     ON tmpLfi.codeDdaf = 
       CASE 
       WHEN tab.codeTypeGeoTableauDeBord = '''||cCodeGeoTableauDep||''' THEN tab.codeDepartement
       WHEN tab.codetypegeotableaudebord = '''||cCodeGeoTableauReg||''' AND EXISTS(SELECT 1 FROM trefdepartement dept WHERE dept.code = tmpLfi.codeDdaf AND dept.codeRegion = tab.codeRegion) THEN tmpLfi.codeDdaf       
       WHEN tab.codetypegeotableaudebord = '''||cCodeGeoTableauNat||''' THEN tmpLfi.codeDdaf
        END     
  WHERE tab.campagne = '''||pCampagne||'''
    AND tmpLfi.campagne = '''||pCampagne||'''
    AND tab.codeTypeTableauDeBord = '''||cCodeTypeTableauCourant||'''
  GROUP BY tab.idTableauDeBord, tmpLfi.codeDdaf';
...