oracle存储过程同步数据执行错误

图片说明
这个是我的存储过程, s_date := to_date(startTime,'yyyy-mm-dd hh24:mi:ss');
我用这样把字符串转成date,但是传进来的字符串是有时分秒的,
转换之后就只剩下年月日了,类似23-12月-17, 第一个if里面是可以正确执行的,后面的elsif 有日期比较的都报错了图片说明
报这个错,求大佬看看

6个回答

s_date := to_date(startTime,'yyyy-mm-dd hh24:mi:ss'); 改为s_date := to_date(startTime,''yyyy-mm-dd hh24:mi:ss''); 2个单引号,时间比较的时候注意两边格式是否一致

qq_34629482
qq_34629482 回复qq_35702591: ok,改成跟你一样的占位符的形式=:1就可以了
接近 2 年之前 回复
qq_35702591
小肥猪。 回复qq_34629482: where t.TJSJ>='||s_date; 就是将你的这个地方,用我刚才那个例子的 方式用:1来替换,然后在用我例子中的using来使用这个变量
接近 2 年之前 回复
qq_35702591
小肥猪。 回复qq_34629482: create or replace procedure down_message_tongbu is V_SQL VARCHAR2(2048); v_id varchar2(43); s_date date; begin s_date:=to_date('2018-02-07 07:13:39','yyyy-MM-dd hh24:mi:ss'); V_SQL:='select id from down_message where create_date= :1'; EXECUTE IMMEDIATE V_SQL INTO v_id using s_date; dbms_output.put_line(v_id); EXCEPTION WHEN OTHERS THEN dbms_output.put_line(sqlerrm); ROLLBACK; COMMIT; end; 自己写了个例子 没有问题能执行成功
接近 2 年之前 回复
qq_34629482
qq_34629482 回复qq_35702591: 可以帮忙写下吗。。不是很理解你的意思
接近 2 年之前 回复
qq_35702591
小肥猪。 回复qq_34629482: 不用变量的那种,你先直接拼在你的sql中试试,我的意思是‘to_date(endTime,''yyyy-mm-dd hh24:mi:ss'')’,:=后面也要加单引号的
接近 2 年之前 回复
qq_34629482
qq_34629482 两个单引号的话e_date := to_date(endTime,''yyyy-mm-dd hh24:mi:ss'');新建存储过程就报错了
接近 2 年之前 回复

to_char(to_date(date, data本身类型),想要的类型)

Mr__Lee1208
Mr__Lee1208 回复qq_34629482: 我以为你要转换成需要的格式类型,再进行比较,你可以写个简单的sql去测试一下啊
接近 2 年之前 回复
Mr__Lee1208
Mr__Lee1208 回复qq_34629482: oracle日期格式如果是字符串的换不需要转换啊,可以直接进行比较的
接近 2 年之前 回复
qq_34629482
qq_34629482 回复Mr__Lee1208: 是字符串啊,varchar2的,直接写varchar2是错的
接近 2 年之前 回复
Mr__Lee1208
Mr__Lee1208 回复qq_34629482: 你把你的startTime的日期格式告诉我,想要转换的格式是什么,我写给你看下
接近 2 年之前 回复
Mr__Lee1208
Mr__Lee1208 回复qq_34629482:你的startTime是什么类型的,格式是'yyyy-mm-dd hh24:mi:ss
接近 2 年之前 回复
qq_34629482
qq_34629482 回复Mr__Lee1208: s_date := to_char(to_date(startTime, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'); 这样吗,报错的ORA-01861: 文字与格式字符串不匹配 ORA-06512
接近 2 年之前 回复
Mr__Lee1208
Mr__Lee1208 回复qq_34629482: 可以
接近 2 年之前 回复
qq_34629482
qq_34629482 这样转成字符串了,还能比较日期吗
接近 2 年之前 回复

报错是你本身传入的参数就有问题,本身存储过程没有问题。
你检查一下你的传入的参数。
问题出在这里。导致_to_date失败_

qq_40023049
qq_40023049 哦哦,对的,很久没写了。有点忘了。
接近 2 年之前 回复
qq_34629482
qq_34629482 参数是‘2013-12-23 11:00:00’这样的 insert into BQ_TJ01 select t.*,sysdate,1 from bq_tj01@DBLINK_QYPT2 t where t.tjsj >= to_date('2013-12-23 11:00:00','yyyy-mm-dd hh24:mi:ss')直接写sql不放到存储过程是可以执行的
接近 2 年之前 回复

s_date varchar2(100);
e_date varchar2(100);

s_date := 'to_date('''||startTime||''',''yyyy-mm-dd hh24:mi:ss'')';

qq_34629482
qq_34629482 谢谢了,试过这个也是可以的
接近 2 年之前 回复

create or replace procedure copy_Data3(tablename in varchar2,startTime in varchar2,endTime in varchar2)
as
dynamic_insert_sql varchar2(500);
s_date VARCHAR2(100);
e_date VARCHAR2(100);
begin
if startTime is null and endTime is null then
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t';
elsif startTime is null and endTime is not null then
e_date := 'to_date('''||endTime||''',''yyyy-mm-dd hh24:mi:ss'')';
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ<='||e_date;
elsif startTime is not null and endTime is null then
s_date := 'to_date('''||startTime||''',''yyyy-mm-dd hh24:mi:ss'')';
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ>='||s_date;
elsif startTime is not null and endTime is not null then
s_date := 'to_date('''||startTime||''',''yyyy-mm-dd hh24:mi:ss'')';
e_date := 'to_date('''||endTime||''',''yyyy-mm-dd hh24:mi:ss'')';
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ>='||s_date||' and t.TJSJ<='||e_date;
end if;
execute immediate dynamic_insert_sql;
COMMIT;
end;

qq_34629482
qq_34629482 谢谢,这个可以的,不过我已经采纳上面的了,不好意思了
接近 2 年之前 回复

create or replace procedure copy_Data3(tablename in varchar2,startTime in varchar2,endTime in varchar2)
as
dynamic_insert_sql varchar2(500);
s_date date;
e_date date;
begin
if startTime is null and endTime is null then
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t';
elsif startTime is null and endTime is not null then
e_date := to_date(endTime,'yyyy-mm-dd hh24:mi:ss');
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ<='||e_date;
elsif startTime is not null and endTime is null then
s_date := to_date(startTime,'yyyy-mm-dd hh24:mi:ss');
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ>='||s_date;
elsif startTime is not null and endTime is not null then
s_date := to_date(startTime,'yyyy-mm-dd hh24:mi:ss');
e_date := to_date(endTime,'yyyy-mm-dd hh24:mi:ss');
dynamic_insert_sql := 'insert into '||tablename||' select t.*,sysdate,'||1||' from '||tablename||'@DBLINK_QYPT2 t where t.TJSJ>='||s_date||' and t.TJSJ<='||e_date;
end if;
execute immediate dynamic_insert_sql;
COMMIT;
end;

上面的图片太小,重新贴一下代码

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!