oracle)PL/sql存储过程中直接使用insert...select语句,统计数据分别变0和1?

时间:2022-09-20 19:23:45
实现功能就是将从table_A、table_B中统计出来的数据插入到table_AB中,
但问题出现了:
手动执行存储过程时,插入的数据没错(统计的数据分别不是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



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。

#4


引用 2 楼 bobo12082119 的回复:
SQL code

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……


谢谢!我会试试的。

不过现在是这样的,我把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;

#6


手动执行存储过程时,可以不需要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


引用 6 楼 zeer1983 的回复:
手动执行存储过程时,可以不需要commit;
但是job时,必须要commit;

我试试。另外,不commit时,插入数据为什么是0和1呢?

#10


会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?

#11


引用 10 楼 hyee 的回复:
会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?

确定就是这个用户。

#12


请教~~~

#1


1、没有group by name分组,你能select name ?
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。

#4


引用 2 楼 bobo12082119 的回复:
SQL code

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……


谢谢!我会试试的。

不过现在是这样的,我把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;

#6


手动执行存储过程时,可以不需要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


引用 6 楼 zeer1983 的回复:
手动执行存储过程时,可以不需要commit;
但是job时,必须要commit;

我试试。另外,不commit时,插入数据为什么是0和1呢?

#10


会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?

#11


引用 10 楼 hyee 的回复:
会不会是你的job的执行者与你手工执行的用户不是同一个user,使得指向的表实际上是不同的?

确定就是这个用户。

#12


请教~~~