Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.4k views
in Technique[技术] by (71.8m points)

oracle中通过to_char对日期进行转换时报错

问题描述

将HDRQ字段中的“第二学期”改成“XXXX-09-01”的格式,其中XXXX表示年份,由字段CREATE_TIME确定。
image

问题出现的环境背景及自己尝试过哪些方法

oracle版本是11g,尝试直接用plsql进行编写,一直报错。很奇怪的是,将代码select to_char(CREATE_TIME,'yyyy') from OD_TPAS_RYCH_STD where ID = v_id;换成固定值(如2019)时,可以正常运行;同样单独运行上面一条语句,并将v_id换成表中的值(如11)时,也可以正常运行。放到一起就不行,求大神帮忙,非常感谢!

相关代码

代码一:

declare   --修改TPAS_RYCH表,HDRQ字段的“第二学期”
  cursor hdrq_cursor is select ID,HDRQ,CREATE_TIME from OD_TPAS_RYCH_STD;
  v_year varchar2(100);
  v_id varchar2(100);
  v_hdrq varchar2(100);
  v_time DATE;
begin
  open hdrq_cursor;
  fetch hdrq_cursor into v_id,v_hdrq,v_time;
  while hdrq_cursor%found loop
        if v_hdrq = '第二学期' then 
            v_year := select to_char(CREATE_TIME,'yyyy') from OD_TPAS_RYCH_STD where ID = v_id;
            update OD_TPAS_RYCH_STD set HDRQ = v_year || '-09-01' where ID = v_id;
        end if;
        fetch hdrq_cursor into v_id,v_hdrq,v_time;
  end loop;
  close hdrq_cursor; 
end;

代码二:(最开始的思路,感觉不太对,而且也一直报错)

update OD_TPAS_RYCH_STD set HDRQ = select substr(CREATE_TIME,0,4) || '-09-01' 
where HDRQ = '第二学期';   --修改TPAS_RYCH表,HDRQ字段的“第二学期”

你期待的结果是什么?实际看到的错误信息又是什么?

正常情况应该将第一行数据的HDRQ字段改成“2019-09-01”,第三行改成“2020-09-01”

代码一提示错误:

> ORA-06550: 第 12 行, 第 14 列: 
PLS-00103: 出现符号 "SELECT"在需要下列之一时:
 ( - + case
   mod new not null <an identifier>
   <a double-quoted delimited-identifier> <a bind variable>
   continue avg count current exists max min prior sql stddev
   sum variance execute forall merge time timestamp interval
   date <a string literal with character set specification>
   <a number> <a single-quoted SQL string> pipe
   <一个带有字符集说明的可带引号的字符串文字>
   <一个可带引号的 SQL 字符串> purge
ORA-06550: 第 13 行, 第 4 列: 
PLS-00103: 出现符号 "UPDATE"
ORA-06550: 第 14 行, 第 3 列: 
PLS-00103: 出现符号 "END"

代码二提示错误:

> ORA-00936: 缺失表达式

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

代码1:在plsql语言中,select不能直接使用,12行改成
select to_char(CREATE_TIME,'yyyy') into v_year from OD_TPAS_RYCH_STD where ID = v_id;

代码2:没有from

细心一点,仔细看下报错信息


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...