2011-11-07 4 views
1

J'ai une requête de construction de code plsql. J'utilise des variables bind et un tableau associatif pour stocker leurs valeurs. Quelque chose comme ça:tableau associatif et sysdate

declare 
    type myt table of varchar2(4000) index by varchar2(100); 
    vars myt; 
    v_cursor integer; 
    newQuery varchar2(1000) := 'select * from blabla where '; 
    bind_key varchar2(100); 
    rows_count integer; 
begin 
    -- query building 
    if 1=1 then 
     newQuery := newQuery || 'col1 = :bind_col1'; 
     vars(':bind_col1') := sysdate; -- problem!!! 
    end if; 
    .... 
    -- query execution 
    v_cursor := dbms_sql.open_cursor; 
    dbms_sql.parse(v_cursor, newQuery, dbms_sql.v7); 
    bind_key := vars.first; 
    loop 
     exit when bind_key is null; 
     dbms_sql.bind_variable(v_cursor, bind_key, vars(bind_key)); 
     bind_key := vars.next(bind_key); 
    end loop; 
    row_count := dbms_sql.execute(v_cursor); 
    dbms_sql.close_cursor(v_cursor); 
end; 

Existe-t-il un type plus générique que varchar2, donc il n'y aura pas de conversion date->varchar2->date?

Répondre

1

dbms_sql.bind_variable peut lier des variables de many datatypes. Vous ne pouvez pas déclarer cependant une table de <any_data_type>

Lorsque vous travaillez avec VARCHAR2, vous pouvez utiliser la conversion explicite bijective, par exemple (ce qui serait logiquement équivalent à quelque chose comme Object[] en java par exemple.):

newQuery := newQuery || 'col1 = to_date(:bind_col1, ''yyyymmdd hh24:mi:ss'')'; 
vars(':bind_col1') := to_char(sysdate, 'yyyymmdd hh24:mi:ss');