Oracle 存储过程insert into select 日期条件问题
遇到个不解问题:先来三段存储过程,奇怪问题在其中(注意日期条件):--(1)T_Name有数据createorreplaceprocedureP_Name(sStartD...
遇到个不解问题:
先来三段存储过程,奇怪问题在其中(注意日期条件):
--(1) T_Name有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
Execute Immediate 'insert into T_Name '||
'select b.CWStyleID,b.MaterialID,b.OutNum Amount '||
'from T_Table1 a,T_Table2 b,T_Table3 c '||
'where to_char(a.CWDate,''yyyy-MM-dd'') between '''||sStartDate||''' and '''||sEndDate||''' '||
'and a.ID=b.ID '||
'and a.ID1=c.ID and b.ID1=344312 ';
commit;
exception
when others then
rollback;
end P_Name;
--(2) T_Name没有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
insert into T_Name
select b.CWStyleID,b.MaterialID,b.OutNum Amount
from T_Table1 a,T_Table2 b,T_Table3 c
where to_char(a.CWDate,'yyyy-MM-dd') between sStartDate and sEndDate
and a.ID=b.ID
and a.ID1=c.ID and b.ID1=344312;
commit;
exception
when others then
rollback;
end P_Name;
--(3) T_Name有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
insert into T_Name
select b.CWStyleID,b.MaterialID,b.OutNum Amount
from T_Table1 a,T_Table2 b,T_Table3 c
where to_char(a.CWDate,'yyyy-MM-dd') between '2014-06-30' and '2014-07-11'
and a.ID=b.ID
and a.ID1=c.ID and b.ID1=344312;
commit;
exception
when others then
rollback;
end P_Name;
从三段过程总结来看,在存储过程中,insert into select 嵌套语句无法识别变量,直接select没问题(字数原因没罗列)。
无法理解,那位大大帮忙解释下,,谢谢。
问题的关键是过程(2)这种方式为什么没有数据?
其实大家可以把焦点放在日期变量上,因为过程(1)通过Execute Immediate执行是成功的(有数据),日期采用变量方式(与过程2一样);过程(3)也是成功的,相比较过程(2),只是日期采用具体方式。
---很抱歉,因为财富值问题,无法跟进大家的回答。谢谢各位了,让我知道问题的根源出在传入参数上,尽管暂时不知道原因。 展开
先来三段存储过程,奇怪问题在其中(注意日期条件):
--(1) T_Name有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
Execute Immediate 'insert into T_Name '||
'select b.CWStyleID,b.MaterialID,b.OutNum Amount '||
'from T_Table1 a,T_Table2 b,T_Table3 c '||
'where to_char(a.CWDate,''yyyy-MM-dd'') between '''||sStartDate||''' and '''||sEndDate||''' '||
'and a.ID=b.ID '||
'and a.ID1=c.ID and b.ID1=344312 ';
commit;
exception
when others then
rollback;
end P_Name;
--(2) T_Name没有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
insert into T_Name
select b.CWStyleID,b.MaterialID,b.OutNum Amount
from T_Table1 a,T_Table2 b,T_Table3 c
where to_char(a.CWDate,'yyyy-MM-dd') between sStartDate and sEndDate
and a.ID=b.ID
and a.ID1=c.ID and b.ID1=344312;
commit;
exception
when others then
rollback;
end P_Name;
--(3) T_Name有数据
create or replace procedure P_Name(
sStartDate in varchar2,
sEndDate in varchar2
) as
begin
insert into T_Name
select b.CWStyleID,b.MaterialID,b.OutNum Amount
from T_Table1 a,T_Table2 b,T_Table3 c
where to_char(a.CWDate,'yyyy-MM-dd') between '2014-06-30' and '2014-07-11'
and a.ID=b.ID
and a.ID1=c.ID and b.ID1=344312;
commit;
exception
when others then
rollback;
end P_Name;
从三段过程总结来看,在存储过程中,insert into select 嵌套语句无法识别变量,直接select没问题(字数原因没罗列)。
无法理解,那位大大帮忙解释下,,谢谢。
问题的关键是过程(2)这种方式为什么没有数据?
其实大家可以把焦点放在日期变量上,因为过程(1)通过Execute Immediate执行是成功的(有数据),日期采用变量方式(与过程2一样);过程(3)也是成功的,相比较过程(2),只是日期采用具体方式。
---很抱歉,因为财富值问题,无法跟进大家的回答。谢谢各位了,让我知道问题的根源出在传入参数上,尽管暂时不知道原因。 展开
展开全部
首先你测试看看,第二段的日期是不是没有传递进去,在ORACLE里面设置输出跟踪到底问题出在哪儿,insert into select 嵌套语句是可以识别变量的,你的语句没什么问题,看看是不是你传递参数没到位
更多追问追答
追问
传递进去了
我去掉insert into ,直接
select count(*) into nCount .......
然后将nCount插入到一个临时表,是大于0的;同时也试过将变量sStartDate和sEndDate插入临时表,再取出来,是有日期的
追答
行了,我大概知道怎么回事了,between and语法问题,你试试测试一下,between 。。and 。。可以比较字符串吗?我测试了一下,是有问题的,这能比较数字和时间类型。速回
展开全部
oracle的在日期转换的时候,月份用mm
to_char(a.CWDate,'yyyy-mm-dd')
更多追问追答
追问
改后测试了,还是不行
追答
你需要确认一下sStartDate 和 sEndDate 传入的值内容。
看是不是 'yyyy-mm-dd' 格式的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
大小写是没关系的,insert into select要带上字段,你把字段给自己省略了,好像这样是不行的,T_NAME表的字段要写上
更多追问追答
追问
试过了,还是不行
追答
从你的存储过程来看没什么问题,条件都很对,应该不会出现没插入数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也碰到这个问题了啊 怎么解决啊 无法识别 定义的常量日期区间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询