ORACLE求助 ORA-00984 列在此处不允许,求助高手回答

时间:2021-08-01 21:33:24
问题1:
今天执行oracle部分语句
alter table student modify birthday default systime,提示ORA-00984 列在此处不允许,个人分析为列birthday不支持格式到时分秒,但是问题来了
如何更新表student的列birthday的格式支持时分秒呢我写了一句然后语句是错误的alter table student modify birthday (to_date=('yyyy-MM-dd HH24:mi:ss'));
请问各位大师如何实现
问题2:
constraint建立的约束是否只对单表生效,亦或者只对单句生效,别的表是否可以调用不是自己表的constraint约束呢?
问题3:
alter table student modify cardId unique与alter table customer add constraint xxxxxx unique(cardId); 实现的内容既然一样那么有什么差别呢?
问题4:
建立的索引是否只适应单表,或者只适用已经指定的单列或者几列呢?
问题5:
创建包、 包体以及过程函数是不是最后的一句话里面都要加上“/”呢,函数加上是会出现错误的函数,其它的不知道是不是都需要加“/”
问题6: 
何种情况为必须是用游标处理的情况?

7 个解决方案

#1


oracle时间字段是datetime,相关操作可如下:
--oracle中时间相关的一些操作

Select sysdate from dual --取当前系统时间

Select to_char(sysdate , 'YYYY-MM-DD HH:MI:SS') from dual --取当前系统时间,转换为字符串
 
Select trunc(sysdate) from dual --取当前日期
 
Select trunc(sysdate , 'MM') from dual --取当前月的第一天
 
Select trunc(sysdate , 'YYYY') from dual --取当年的元旦
 
Select to_char(sysdate , 'ss') from dual --取当前时间秒部分
 
Select to_char(sysdate , 'mi') from dual --取当前时间分钟部分
 
Select to_char(sysdate , 'HH24') from dual  --取当前时间小时部分
 
Select to_char(sysdate , 'DD') from dual  --取当前时间日期部分 

Select to_char(sysdate , 'MM') from dual  --取当前时间月部分
 
Select to_char(sysdate , 'YYYY') from dual  --取当前时间年部分
 
Select to_char(sysdate , 'w') from dual  --取当前时间是一个月中的第几周(从1日开始算)
 
Select to_char(sysdate , 'ww') from dual  --取当前时间是一年中的第几周(从1.1开始算)
 
Select to_char(sysdate , 'iw') from dual  --取当前时间是一年中的第几周(按实际日历的)
 
Select to_char(sysdate , 'd') from dual  --取当前时间是一周的第几天,从星期天开始,周六结束 

Select to_char(sysdate , 'day') from dual --取当前日是星期几,和数据库设置的字符集有关,会输出’Tuesday’ 

Select to_char(sysdate , 'ddd') from dual --当前日是一年中的第几天 

Select Add_months(sysdate , 12) from dual --取一年后的今天 

Select sysdate - (sysdate - 100) from dual --取两个日期之间的天数 

Select (sysdate - (sysdate - 100)) * 1440 from dual --取两个日期之间的分钟数
 
Select (sysdate - (sysdate - 100)) * 1440 * 60 from dual --取两个日期之间的秒数
 
Select months_between(sysdate,sysdate - 100) from dual --取两个日期间隔的月份

Select trunc(months_between(sysdate,sysdate - 100)) from dual --取两个日期间隔的月份
 
Select trunc(last_day(sysdate)) from dual --取当前月的最后一天
 
Select next_day(sysdate , 1) from dual --取当前日之后第一个星期天,里面的’1’表示取星期日,如果今天正好是星期日,则会显示下一个星期日 



1.显示当前时间

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') current_time from dual;

/*
CURRENT_TIME       
-------------------
2007-09-29 09:29:03
1 row selected
*/

select current_date current_time from dual;

/*
CURRENT_TIME   
----------------
2007-9-29 10:34:
1 row selected
*/

2.只显示日期,不显示时间

select to_char(sysdate,'yyyy-mm-dd') current_date from dual;

/*
CURRENT_DATE
------------
2007-09-29  
1 row selected
*/


按时间分组求和

ID      INPUT_DATE              NUM
--      ------------------      ---
1 2007-9-29 9:52:53 10
2 2007-9-29 9:53:16 20
3 2007-9-29 9:53:32 30
4 2007-9-29 9:53:41 40
5 2007-9-29 9:53:52 50
6 2007-9-28 9:00:00 60
7 2007-9-28 9:01:00 70
8 2007-9-28 9:02:00 80
9 2007-9-28 10:00:00 90

1、对上述数据按日期求和,结果如下:
日期              NUM
---------- ----------
2007-09-28        300
2007-09-29        150


--sql语句
select to_char(input_date,'yyyy-mm-dd') 日期 , sum(num) num 
from jh01 
group by to_char(input_date,'yyyy-mm-dd')

--结果
/*
日期              NUM
---------- ----------
2007-09-28        300
2007-09-29        150
2 rows selected
*/

2、对数据按每天每小时求和,结果如下:
日期                 NUM
------------- ----------
2007-09-28 09        210
2007-09-28 10         90
2007-09-29 09        150

--sql语句
select to_char(input_date,'yyyy-mm-dd hh24') 日期 , sum(num) num 
from jh01 
group by to_char(input_date,'yyyy-mm-dd hh24')

--结果
/*
日期                 NUM
------------- ----------
2007-09-28 09        210
2007-09-28 10         90
2007-09-29 09        150
3 rows selected
*/

3.按日期取num最大值的记录

ID INPUT_DATE NUM
-- ---------- ---
9  2007-09-28 90
5  2007-09-29 50

--sql
select a.id , to_char(a.input_date,'yyyy-mm-dd') input_date,a.num from jh01 a,
(
  select to_char(input_date,'yyyy-mm-dd') input_date, max(num) num 
  from jh01 
  group by to_char(input_date,'yyyy-mm-dd')
) b
where to_char(a.input_date,'yyyy-mm-dd') = b.input_date and a.num = b.num  

/*
ID INPUT_DATE NUM
-- ---------- ---
9  2007-09-28 90
5  2007-09-29 50
2 rows selected
*/

#2


提示ORA-00984 错误是由于ORACLE没有SYSTIME,应该用SYSDATE。
DATE数据类型已包含了日期和时间。

#3


1、用sysdate 。date类型包括日期和事件,再详细的可以用timestamp
2、别的表是否可以调用不是自己表的constraint约束? 没理解你的意思。字面上看,不能。。
3、多少还是有差异的。比如,modify模式,不能同时修改两个列,而add constraint可以,modify不能指定表空间,add模式可以等等。
4、索引是建立在列上,你的“适应”是个什么概念?
5、/ 表示执行的意思
6、没有必须。即使是单行处理,也可以弄个集合,然后用for等循环,不过,更麻烦了。

#4


你好,感谢你的回答,关于第二点别的表是否可以调用不是自己表的constraint约束,意思就是当我用constraint命令对一个test1表建立了约束条件a1后,用已建立的a1约束是否可以对别的表test表进行同样约束呢?
关于第四点:适用的意思就是说 建立的东西是否只能使用在建立的索引所指定的单列或者列?
谢谢

引用 3 楼 jdsnhan 的回复:
1、用sysdate 。date类型包括日期和事件,再详细的可以用timestamp
2、别的表是否可以调用不是自己表的constraint约束? 没理解你的意思。字面上看,不能。。
3、多少还是有差异的。比如,modify模式,不能同时修改两个列,而add constraint可以,modify不能指定表空间,add模式可以等等。
4、索引是建立在列上,你的“适应”是个什么概念?
5、……

#5


 自己的小帖子帮忙顶下啊 

#6


该回复于2012-03-01 17:34:31被版主删除

#7


2、有相关约束,比如主键和外键的关系
4、你在a列建索引,当然需要a列参与查询才能起作用。至于你查的内容嘛,可以不是索引列

#1


oracle时间字段是datetime,相关操作可如下:
--oracle中时间相关的一些操作

Select sysdate from dual --取当前系统时间

Select to_char(sysdate , 'YYYY-MM-DD HH:MI:SS') from dual --取当前系统时间,转换为字符串
 
Select trunc(sysdate) from dual --取当前日期
 
Select trunc(sysdate , 'MM') from dual --取当前月的第一天
 
Select trunc(sysdate , 'YYYY') from dual --取当年的元旦
 
Select to_char(sysdate , 'ss') from dual --取当前时间秒部分
 
Select to_char(sysdate , 'mi') from dual --取当前时间分钟部分
 
Select to_char(sysdate , 'HH24') from dual  --取当前时间小时部分
 
Select to_char(sysdate , 'DD') from dual  --取当前时间日期部分 

Select to_char(sysdate , 'MM') from dual  --取当前时间月部分
 
Select to_char(sysdate , 'YYYY') from dual  --取当前时间年部分
 
Select to_char(sysdate , 'w') from dual  --取当前时间是一个月中的第几周(从1日开始算)
 
Select to_char(sysdate , 'ww') from dual  --取当前时间是一年中的第几周(从1.1开始算)
 
Select to_char(sysdate , 'iw') from dual  --取当前时间是一年中的第几周(按实际日历的)
 
Select to_char(sysdate , 'd') from dual  --取当前时间是一周的第几天,从星期天开始,周六结束 

Select to_char(sysdate , 'day') from dual --取当前日是星期几,和数据库设置的字符集有关,会输出’Tuesday’ 

Select to_char(sysdate , 'ddd') from dual --当前日是一年中的第几天 

Select Add_months(sysdate , 12) from dual --取一年后的今天 

Select sysdate - (sysdate - 100) from dual --取两个日期之间的天数 

Select (sysdate - (sysdate - 100)) * 1440 from dual --取两个日期之间的分钟数
 
Select (sysdate - (sysdate - 100)) * 1440 * 60 from dual --取两个日期之间的秒数
 
Select months_between(sysdate,sysdate - 100) from dual --取两个日期间隔的月份

Select trunc(months_between(sysdate,sysdate - 100)) from dual --取两个日期间隔的月份
 
Select trunc(last_day(sysdate)) from dual --取当前月的最后一天
 
Select next_day(sysdate , 1) from dual --取当前日之后第一个星期天,里面的’1’表示取星期日,如果今天正好是星期日,则会显示下一个星期日 



1.显示当前时间

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') current_time from dual;

/*
CURRENT_TIME       
-------------------
2007-09-29 09:29:03
1 row selected
*/

select current_date current_time from dual;

/*
CURRENT_TIME   
----------------
2007-9-29 10:34:
1 row selected
*/

2.只显示日期,不显示时间

select to_char(sysdate,'yyyy-mm-dd') current_date from dual;

/*
CURRENT_DATE
------------
2007-09-29  
1 row selected
*/


按时间分组求和

ID      INPUT_DATE              NUM
--      ------------------      ---
1 2007-9-29 9:52:53 10
2 2007-9-29 9:53:16 20
3 2007-9-29 9:53:32 30
4 2007-9-29 9:53:41 40
5 2007-9-29 9:53:52 50
6 2007-9-28 9:00:00 60
7 2007-9-28 9:01:00 70
8 2007-9-28 9:02:00 80
9 2007-9-28 10:00:00 90

1、对上述数据按日期求和,结果如下:
日期              NUM
---------- ----------
2007-09-28        300
2007-09-29        150


--sql语句
select to_char(input_date,'yyyy-mm-dd') 日期 , sum(num) num 
from jh01 
group by to_char(input_date,'yyyy-mm-dd')

--结果
/*
日期              NUM
---------- ----------
2007-09-28        300
2007-09-29        150
2 rows selected
*/

2、对数据按每天每小时求和,结果如下:
日期                 NUM
------------- ----------
2007-09-28 09        210
2007-09-28 10         90
2007-09-29 09        150

--sql语句
select to_char(input_date,'yyyy-mm-dd hh24') 日期 , sum(num) num 
from jh01 
group by to_char(input_date,'yyyy-mm-dd hh24')

--结果
/*
日期                 NUM
------------- ----------
2007-09-28 09        210
2007-09-28 10         90
2007-09-29 09        150
3 rows selected
*/

3.按日期取num最大值的记录

ID INPUT_DATE NUM
-- ---------- ---
9  2007-09-28 90
5  2007-09-29 50

--sql
select a.id , to_char(a.input_date,'yyyy-mm-dd') input_date,a.num from jh01 a,
(
  select to_char(input_date,'yyyy-mm-dd') input_date, max(num) num 
  from jh01 
  group by to_char(input_date,'yyyy-mm-dd')
) b
where to_char(a.input_date,'yyyy-mm-dd') = b.input_date and a.num = b.num  

/*
ID INPUT_DATE NUM
-- ---------- ---
9  2007-09-28 90
5  2007-09-29 50
2 rows selected
*/

#2


提示ORA-00984 错误是由于ORACLE没有SYSTIME,应该用SYSDATE。
DATE数据类型已包含了日期和时间。

#3


1、用sysdate 。date类型包括日期和事件,再详细的可以用timestamp
2、别的表是否可以调用不是自己表的constraint约束? 没理解你的意思。字面上看,不能。。
3、多少还是有差异的。比如,modify模式,不能同时修改两个列,而add constraint可以,modify不能指定表空间,add模式可以等等。
4、索引是建立在列上,你的“适应”是个什么概念?
5、/ 表示执行的意思
6、没有必须。即使是单行处理,也可以弄个集合,然后用for等循环,不过,更麻烦了。

#4


你好,感谢你的回答,关于第二点别的表是否可以调用不是自己表的constraint约束,意思就是当我用constraint命令对一个test1表建立了约束条件a1后,用已建立的a1约束是否可以对别的表test表进行同样约束呢?
关于第四点:适用的意思就是说 建立的东西是否只能使用在建立的索引所指定的单列或者列?
谢谢

引用 3 楼 jdsnhan 的回复:
1、用sysdate 。date类型包括日期和事件,再详细的可以用timestamp
2、别的表是否可以调用不是自己表的constraint约束? 没理解你的意思。字面上看,不能。。
3、多少还是有差异的。比如,modify模式,不能同时修改两个列,而add constraint可以,modify不能指定表空间,add模式可以等等。
4、索引是建立在列上,你的“适应”是个什么概念?
5、……

#5


 自己的小帖子帮忙顶下啊 

#6


该回复于2012-03-01 17:34:31被版主删除

#7


2、有相关约束,比如主键和外键的关系
4、你在a列建索引,当然需要a列参与查询才能起作用。至于你查的内容嘛,可以不是索引列