今天有一开发兄弟找我,说oracle 出现一奇怪现象,在存储过程中赋date类型的值,时、分、秒都丢失了,下面来做个试验:
今天有一开发兄弟找我,说oracle 出现一奇怪现象,在存储过程中赋date类型的值,时、分、秒都丢失了,下面来做个试验:
sql> drop table test purge;
sql> create table test
(
fill_date date
);
sql> insert into test values(sysdate);
sql> commit;
sql> select to_char(fill_date,'yyyy-mm-dd hh24:mi:ss') from test;
to_char(fill_date,'
-------------------
2014-07-18 17:47:22
sql> create or replace procedure test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-mm-dd hh24:mi:ss');
s_sql := 'update test set fill_date = '''||s_date ||'''';
execute immediate s_sql;
commit;
end;
/
sql> call test_p();
sql> select to_char(fill_date,'yyyy-mm-dd hh24:mi:ss') from test;
to_char(fill_date,'
-------------------
2014-07-18 00:00:00 --可以看到确实时、分、秒已经丢失,怀疑是隐式转换导致
--调整下存储过程,,看打印出什么来。
sql> create or replace procedure test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-mm-dd hh24:mi:ss');
s_sql := 'update test set fill_date = '''||s_date ||'''';
dbms_output.put_line(s_sql);
execute immediate s_sql;
commit;
end;
/
sql> set serveroutput on
sql> call test_p();
update test set fill_date = '18-7月 -14'
调用完成。
--确认发生了隐式转换,那就使用绑定变量了
sql> create or replace procedure test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-mm-dd hh24:mi:ss');
s_sql := 'update test set fill_date = :1';
execute immediate s_sql using s_date;
commit;
end;
/
sql> call test_p();
调用完成。
sql> select to_char(fill_date,'yyyy-mm-dd hh24:mi:ss') from test;
to_char(fill_date,'
-------------------
2014-07-18 17:24:32
java中用jdbc调用oracle存储过程和函数
oracle存储过程本地编译方式
oracle 存储过程及ref cursor的使用
oracle存储过程中提示“权限不足”的解决办法
oracle利用存储过程返回结果集开发报表
oracle存储过程中临时表的使用技巧
本文永久更新链接地址: