ассоциативный массив и sysdate - PullRequest
1 голос
/ 07 ноября 2011

У меня есть запрос построения кода plsql.Я использую переменные связывания и ассоциативный массив для хранения их значений.Примерно так:

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 Ответ

1 голос
/ 08 ноября 2011

dbms_sql.bind_variable может связывать переменные многих типов данных . Однако вы не можете объявить таблицу <any_data_type> (которая логически эквивалентна чему-то вроде Object[] в java, например.)

Когда вы работаете с VARCHAR2, вы можете использовать биективное явное преобразование, например:

newQuery := newQuery || 'col1 = to_date(:bind_col1, ''yyyymmdd hh24:mi:ss'')';
vars(':bind_col1') := to_char(sysdate, 'yyyymmdd hh24:mi:ss');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...