2011-11-07 17 views
1

私はクエリ構築のplsqlコードを持っています。私は、それらの値を格納するためにバインド変数と連想配列を使用します。そのような何か: 連想配列と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; 

varchar2より任意のより一般的なタイプがありますので、変換 date->varchar2->dateがないでしょうか?

答えて

1

dbms_sql.bind_variableは、many datatypesの変数に結合することができる。ただし<any_data_type>のテーブル宣言することはできませんあなたがVARCHAR2で作業しているときには、例えば、全単射明示的な変換を使用することができます

(例えばJavaでObject[]のようなものと論理的に等価になります。):

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