2017-05-22 3 views
0

Je fais plusieurs saisies de données dans un programme mon Python (dans un cahier Jupyter) en utilisant le code SQL DB2 qui a déjà été écrit - Je l'ai simplement collé dans des chaînes entre guillemets et ouvrant une connexion JDBC en utilisant la bibliothèque Jaydebe. Cela a bien fonctionné pour plusieurs tirages, mais pour une traction plus compliquée, je continue d'obtenir une erreur "EOF dans une chaîne multi-lignes". J'ai confirmé que le SQL fonctionne bien quand je le colle dans WinSQL, donc je ne pense pas que ce soit un problème de parenthèse manquante ou quelque chose du genre. Je vais coller le bloc de code, puis l'erreur.SQL en python EOF

curs = conn.cursor() 
curs.execute("""/* Determine Final Payment Date for Closed Claims */ 

declare global temporary table session.cause_close_dt (
    hcode varchar(25), 
    claim_number varchar(15), 
    spec_cov char(2), 
    cause_of_loss char(2), 
    final_pmt_dt date) 
with replace partitioning key (hcode) using hashing on commit preserve rows; 

insert into session.cause_close_dt (
    hcode, 
    claim_number, 
    spec_cov, 
    cause_of_loss, 
    final_pmt_dt) 

select distinct 
    hcode, 
    state||pui||division||trim(claim_number) as claim_number, 
    spec_cov, 
    cause_of_loss, 
    max(date_of_final_payment) as final_pmt_dt 
from 
    v23.fire_los_v 
where 
    state in('05','55','75') 
    and hcode in('022###') 
    and payment_status in('1','A') 
    and date_of_final_payment is not null 
    and year(date_of_final_payment) > 2004 
group by 
    hcode, 
    state||pui||division||trim(claim_number), 
    spec_cov, 
    cause_of_loss 
order by 
    1,2,3,4 

/* Summarize Loss Data by Closed Date */ 
select 
    state, 
    hcode, 
    cause_close_yr, 
    cause_close_qtr, 
    kind_of_loss, 
    sum(paid_cause_cnt_ncat) as ncpd_cause_cnt, 
    sum(paid_amt_tot_ncat) as ncpd_amt 
from (
    select 
    u92.statename_u(a.state) as state, 
    case 
     when a.hcode in('022###') then 'PIM' 
     else '' 
    end as hcode, 
    a.year, 
    a.state||a.pui||a.division||trim(a.claim_number) as claim_number, 
    a.kol_sum as kind_of_loss, 
    a.cause_of_loss, 
    a.spec_cov, 
    b.final_pmt_dt, 
    year(b.final_pmt_dt) as cause_close_yr, 
    quarter(b.final_pmt_dt) as cause_close_qtr, 
    paid_cause_cnt_ncat, 
    paid_amt_tot_ncat 
    from 
    v23.fire_los_v a 
    left outer join session.cause_close_dt b on 
     a.hcode = b.hcode 
     and a.state||a.pui||a.division||trim(a.claim_number) = b.claim_number 
     and a.cause_of_loss = b.cause_of_loss 
     and a.spec_cov = b.spec_cov 
    where 
    a.state in('05','55','75') 
    and a.hcode in('022###')) 
where 
    cause_close_yr > 2004 
group by 
    state, 
    hcode, 
    cause_close_yr, 
    cause_close_qtr, 
    kind_of_loss 
order by 1,2,5,3,4; 
""") 
test = curs.fetchall() 

L'erreur que je me suit:

ERROR: An unexpected error occurred while tokenizing input 
The following traceback may be corrupted or invalid 
The error message is: ('EOF in multi-line string', (1, 0)) 


com.ibm.db2.jcc.am.SqlSyntaxErrorExceptionPyRaisableTraceback (most recent call last) 
<ipython-input-32-90277cac8343> in <module>() 
    85 kind_of_loss 
    86 order by 1,2,5,3,4; 
---> 87 """) 
    88 test = curs.fetchall() 

/opt/anaconda/4.1.1/lib/python2.7/site-packages/jaydebeapi/__init__.pyc in execute(self, operation, parameters) 
    495    parameters =() 
    496   self._close_last() 
--> 497   self._prep = self._connection.jconn.prepareStatement(operation) 
    498   self._set_stmt_parms(self._prep, parameters) 
    499   try: 

com.ibm.db2.jcc.am.SqlSyntaxErrorExceptionPyRaisable: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=; 

insert into session.cause_clos;commit preserve rows;<distribute_by>, DRIVER=4.15.122 

L'erreur pointe toujours à la dernière ligne avec les triples guillemets. Je ne suis pas sûr que l'espacement du SQL jette des choses. J'ai essayé quelques choses comme changer l'espacement et enlever les points-virgules mais rien ne semble fonctionner.

+0

Il semblerait qu'il manque un point-virgule après la clause 'order by' de la première instruction' select'. – chepner

+0

J'ai ajouté cela, j'ai la même erreur. Je devrais noter que je ne pense pas que les points-virgules sont nécessaires - je cours fréquemment SQL dans WinSQL sans les employer. – user5888721

+0

Le message d'erreur semble indiquer que la ligne '" "") 'est l'emplacement de la chaîne _starts_, ce qui est impair –

Répondre

0

Le problème consistait à exécuter une instruction SQL avec plusieurs sélections dans une instruction execute(). Voici à quoi ressemblait mon code final:

curs = conn.cursor() 
curs.execute("""declare global temporary table session.cause_close_dt (
    hcode varchar(25), 
    claim_number varchar(15), 
    spec_cov char(2), 
    cause_of_loss char(2), 
    final_pmt_dt date) 
with replace partitioning key (hcode) using hashing on commit preserve rows""") 

curs.execute("""insert into session.cause_close_dt (
    hcode, 
    claim_number, 
    spec_cov, 
    cause_of_loss, 
    final_pmt_dt) 

select distinct 
    hcode, 
    state||pui||division||trim(claim_number) as claim_number, 
    spec_cov, 
    cause_of_loss, 
    max(date_of_final_payment) as final_pmt_dt 
from 
    v23.fire_los_v 
where 
    state in('05','55','75') 
    and hcode in('022###') 
    and payment_status in('1','A') 
    and date_of_final_payment is not null 
    and year(date_of_final_payment) > 2004 
group by 
    hcode, 
    state||pui||division||trim(claim_number), 
    spec_cov, 
    cause_of_loss 
order by 
    1,2,3,4""") 

curs.execute(""" 
select 
    state, 
    hcode, 
    cause_close_yr, 
    cause_close_qtr, 
    kind_of_loss, 
    sum(paid_cause_cnt_ncat) as ncpd_cause_cnt, 
    sum(paid_amt_tot_ncat) as ncpd_amt 
from (
    select 
    u92.statename_u(a.state) as state, 
    case 
     when a.hcode in('022###') then 'PIM' 
     else '' 
    end as hcode, 
    a.year, 
    a.state||a.pui||a.division||trim(a.claim_number) as claim_number, 
    a.kol_sum as kind_of_loss, 
    a.cause_of_loss, 
    a.spec_cov, 
    b.final_pmt_dt, 
    year(b.final_pmt_dt) as cause_close_yr, 
    quarter(b.final_pmt_dt) as cause_close_qtr, 
    paid_cause_cnt_ncat, 
    paid_amt_tot_ncat 
    from 
    v23.fire_los_v a 
    left outer join session.cause_close_dt b on 
     a.hcode = b.hcode 
     and a.state||a.pui||a.division||trim(a.claim_number) = b.claim_number 
     and a.cause_of_loss = b.cause_of_loss 
     and a.spec_cov = b.spec_cov 
    where 
    a.state in('05','55','75') 
    and a.hcode in('022###')) 
where 
    cause_close_yr > 2004 
group by 
    state, 
    hcode, 
    cause_close_yr, 
    cause_close_qtr, 
    kind_of_loss 
order by 1,2,5,3,4 
""") 
test = curs.fetchall()