我有查询构建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
?
答案 0 :(得分:1)
dbms_sql.bind_variable
可以绑定many datatypes的变量。但是,您无法声明<any_data_type>
的表(例如,它在逻辑上等同于java中的Object[]
。)
当您使用VARCHAR2时,您可以使用双向显式转换,例如:
newQuery := newQuery || 'col1 = to_date(:bind_col1, ''yyyymmdd hh24:mi:ss'')';
vars(':bind_col1') := to_char(sysdate, 'yyyymmdd hh24:mi:ss');