declare
v_col1 varchar2(100);
v_col2 varchar2(100);
v_col3 varchar2(100);
v_t_col1 timestamp(0);
v_t_col2 timestamp(6);
v_t_col3 timestamp(9);
begin
dbms_output.put_line('select directly from table');
select to_char(col1, 'yyyy/mm/dd hh24:mi:ssxff'),
to_char(col2, 'yyyy/mm/dd hh24:mi:ssxff'),
to_char(col3, 'yyyy/mm/dd hh24:mi:ssxff')
into v_col1, v_col2, v_col3
from ts_test;
dbms_output.put_line(v_col1); --no ff
dbms_output.put_line(v_col2); --6 digits ff
dbms_output.put_line(v_col3); --9 digits ff
dbms_output.put_line('select into PL/SQL TIMESTAMP variables');
select col1, col2, col3
into v_t_col1, v_t_col2, v_t_col3
from ts_test;
v_col1 := to_char(v_t_col1, 'yyyy/mm/dd hh24:mi:ssxff');
v_col2 := to_char(v_t_col2, 'yyyy/mm/dd hh24:mi:ssxff');
v_col3 := to_char(v_t_col3, 'yyyy/mm/dd hh24:mi:ssxff');
dbms_output.put_line(v_col1); --expect no ff, get 9 digits
dbms_output.put_line(v_col2); --expect 6 digits ff, get 9 digits
dbms_output.put_line(v_col3); --9 digits ff
dbms_output.put_line('process PL/SQL variables in SQL');
select to_char(v_t_col1, 'yyyy/mm/dd hh24:mi:ssxff'),
to_char(v_t_col2, 'yyyy/mm/dd hh24:mi:ssxff'),
to_char(v_t_col3, 'yyyy/mm/dd hh24:mi:ssxff')
into v_col1, v_col2, v_col3
from dual;
dbms_output.put_line(v_col1); --no ff
dbms_output.put_line(v_col2); --6 digits ff
dbms_output.put_line(v_col3); --9 digits ff
dbms_output.put_line('even SYSTIMESTAMP behave differently in SQL and PL/SQL');
select to_char(SYSTIMESTAMP, 'yyyy/mm/dd hh24:mi:ssxff') into v_col1 from dual;
v_col2 := to_char(SYSTIMESTAMP, 'yyyy/mm/dd hh24:mi:ssxff');
dbms_output.put_line(v_col1); --6 digits ff, which is expected since this is the default
dbms_output.put_line(v_col2); --9 digits ff
end;