但问题出现了:
手动执行存储过程时,插入的数据没错(统计的数据分别不是0和1),但用JOB定时执行时,插入table_AB的数据一个是0,一个是1,很奇怪为什么这样?
代码大致如下:
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select count(1) m,66 name from table_A)a
left join
(select count(1) n ,66 name from table_B )b
on a.name=b.name;
end prc_test;
12 个解决方案
#1
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
2、存储过程中也不提交?
#2
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select count(1) m,66 name from table_A)a
left join
(select count(1) n ,66 name from table_B )b
on a.name=b.name;
commit;--在过程中添加数据一般要commit
exception
when others then
rollback;--如果遇到异常,回滚操作
end prc_test;
#3
[Quote=引用 1 楼 tangren 的回复:]
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
name 是66的别名,不需要group的~
另外,不commit我确实看到插入新表数据了,而且还是0和1。
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
name 是66的别名,不需要group的~
另外,不commit我确实看到插入新表数据了,而且还是0和1。
#4
谢谢!我会试试的。
不过现在是这样的,我把insert 语句放在varchar2变量中,
varchar2(200) v_sql;
v_sql='insert语句';
--然后
execute immediate v_sql;
任然未解决上述问题
#5
count()函数需要和group by一起使用的,另外不知道下面的能不能满足楼主的要求
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select row_number()over(order by name) m,66 name from table_A)a
left join
(select row_number()over(order by name) n ,66 name from table_B )b
on a.name=b.name;
end prc_test;
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select row_number()over(order by name) m,66 name from table_A)a
left join
(select row_number()over(order by name) n ,66 name from table_B )b
on a.name=b.name;
end prc_test;
#6
手动执行存储过程时,可以不需要commit;
但是job时,必须要commit;
但是job时,必须要commit;
#7
create or replace procedure prc_test
as
begin
insert into table_AB
select sysdate ,
(select count(*) from table_A),
(select count(*) from table_B)
from dual;
commit;
end prc_test;
#8
我提出的问题,没有人帮忙回答下嘛?~
#9
我试试。另外,不commit时,插入数据为什么是0和1呢?
#10
会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?
#11
确定就是这个用户。
#12
请教~~~
#1
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
2、存储过程中也不提交?
#2
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select count(1) m,66 name from table_A)a
left join
(select count(1) n ,66 name from table_B )b
on a.name=b.name;
commit;--在过程中添加数据一般要commit
exception
when others then
rollback;--如果遇到异常,回滚操作
end prc_test;
#3
[Quote=引用 1 楼 tangren 的回复:]
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
name 是66的别名,不需要group的~
另外,不commit我确实看到插入新表数据了,而且还是0和1。
1、没有group by name分组,你能select name ?
2、存储过程中也不提交?
name 是66的别名,不需要group的~
另外,不commit我确实看到插入新表数据了,而且还是0和1。
#4
谢谢!我会试试的。
不过现在是这样的,我把insert 语句放在varchar2变量中,
varchar2(200) v_sql;
v_sql='insert语句';
--然后
execute immediate v_sql;
任然未解决上述问题
#5
count()函数需要和group by一起使用的,另外不知道下面的能不能满足楼主的要求
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select row_number()over(order by name) m,66 name from table_A)a
left join
(select row_number()over(order by name) n ,66 name from table_B )b
on a.name=b.name;
end prc_test;
create or replace procedure prc_test
as
begin
insert into table_AB select sysdate ,m,n
from
(select row_number()over(order by name) m,66 name from table_A)a
left join
(select row_number()over(order by name) n ,66 name from table_B )b
on a.name=b.name;
end prc_test;
#6
手动执行存储过程时,可以不需要commit;
但是job时,必须要commit;
但是job时,必须要commit;
#7
create or replace procedure prc_test
as
begin
insert into table_AB
select sysdate ,
(select count(*) from table_A),
(select count(*) from table_B)
from dual;
commit;
end prc_test;
#8
我提出的问题,没有人帮忙回答下嘛?~
#9
我试试。另外,不commit时,插入数据为什么是0和1呢?
#10
会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?
#11
确定就是这个用户。
#12
请教~~~