oracle存储过程及job的问题

ohuo 2017-06-27 11:44:27
很难受,oracle看了两天就被老师拿去要写一个存储过程,再写成job,让每天可以自动刷新。一脸懵逼,所以来请教各位大佬,多谢!
因为项目的表不好直接拿出来,就稍微代替一下。嗯,其中,plpl表是每天都会有人往里加数据的,这个不用管,需要往ll表刷进plpl表里新加的内容:
create or replace procedure test_test
is
str_sql varchar2(1500);
begin
str_sql := 'create global temporary table table_test as select * from (select id_p
from plpl t
minus
select id_p from ll)';
execute immediate str_sql;


str_sql:='insert into ll
select s.* from plpl s
where exists (select 1 from table_test t where t.id_p = s.id_p)';
execute immediate str_sql;
str_sql:= 'drop table table_test';
execute immediate str_sql;
COMMIT;

end;

绝望,图片一直发不了..plpl假设有7条数据,ll假设有4条数据。求大佬们帮忙看一看顺便指正一下错误,如果可以,还请顺便怼一下job,多谢!
...全文
500 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
imcmuc 2017-07-05
  • 打赏
  • 举报
回复
引用 10 楼 qq_32206115 的回复:
[quote=引用 8 楼 qq_38206656 的回复:] 写了一个和你那个一样的cp,运行很多次没问题啊。。 你在数据库中执行 SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'TABLE_TEST'; 这个sql是查看本用户下,有没有包含表名称为TABLE_TEST的表,看一下能不能查到数据。如果有的话,那是DROP没作用,没有的话是其他的原因。 先手动drop一下你的TABLE_TEST,然后执行存储过程,再查一下有没有TABLE_TEST这个表。
不好意思啊,这几天在怼另外一个,没有注意到这的消息...嗯,用了你的那条语句,没有查到table_test,觉得不稳,就手动drop了table_test,再执行就可以用了...对,然后我写了个相同的例子,里面的所有表都重新建,table_test也换了,procedure名字也不一样,没有进行查表也没有drop,但是也能用...倔强地又写了一个,而且是重新开plsql dev也是不用啥操作就是好的...搞不懂。 最后还得麻烦您一下,那个最开始的那句str_sql varchar2(x),这个x是根据什么设置的呀,多谢~[/quote]你用str_sql 保存要执行的SQL语句,X就是SQL语句可能出现的最大长度,和字段定义应该差不多。具体可以查一下varchar2和char的区别。
ohuo 2017-07-05
  • 打赏
  • 举报
回复
引用 9 楼 sxq129601 的回复:
[quote=引用 5 楼 qq_32206115 的回复:] [quote=引用 1 楼 wmxcn2000 的回复:] exrcute immediate 创建临时表后,查一下,应该没有数据,你核对一下。
对,是的,改成普通表就好了,但是第二次执行就提示‘名称已由现有对象使用’,应该是drop没有作用,但不知道该怎么下手...请大佬再看一看[/quote] drop没用,肯定会报错的,看看是啥错误[/quote]不好意思哈,现在才看到您的消息,应该就是table_test没有被drop掉,但是就像我给8楼回复的那样,很迷,莫名其妙就好了...最后还得请教您一下,那句str_sql varchar2(x),这个x是根据什么设置的呀,多谢~
ohuo 2017-07-05
  • 打赏
  • 举报
回复
引用 8 楼 qq_38206656 的回复:
写了一个和你那个一样的cp,运行很多次没问题啊。。 你在数据库中执行 SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'TABLE_TEST'; 这个sql是查看本用户下,有没有包含表名称为TABLE_TEST的表,看一下能不能查到数据。如果有的话,那是DROP没作用,没有的话是其他的原因。 先手动drop一下你的TABLE_TEST,然后执行存储过程,再查一下有没有TABLE_TEST这个表。
不好意思啊,这几天在怼另外一个,没有注意到这的消息...嗯,用了你的那条语句,没有查到table_test,觉得不稳,就手动drop了table_test,再执行就可以用了...对,然后我写了个相同的例子,里面的所有表都重新建,table_test也换了,procedure名字也不一样,没有进行查表也没有drop,但是也能用...倔强地又写了一个,而且是重新开plsql dev也是不用啥操作就是好的...搞不懂。 最后还得麻烦您一下,那个最开始的那句str_sql varchar2(x),这个x是根据什么设置的呀,多谢~
sxq129601 2017-07-03
  • 打赏
  • 举报
回复
引用 5 楼 qq_32206115 的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] exrcute immediate 创建临时表后,查一下,应该没有数据,你核对一下。
对,是的,改成普通表就好了,但是第二次执行就提示‘名称已由现有对象使用’,应该是drop没有作用,但不知道该怎么下手...请大佬再看一看[/quote] drop没用,肯定会报错的,看看是啥错误
imcmuc 2017-07-03
  • 打赏
  • 举报
回复
写了一个和你那个一样的cp,运行很多次没问题啊。。 你在数据库中执行 SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'TABLE_TEST'; 这个sql是查看本用户下,有没有包含表名称为TABLE_TEST的表,看一下能不能查到数据。如果有的话,那是DROP没作用,没有的话是其他的原因。 先手动drop一下你的TABLE_TEST,然后执行存储过程,再查一下有没有TABLE_TEST这个表。
imcmuc 2017-07-02
  • 打赏
  • 举报
回复
引用 4 楼 qq_32206115 的回复:
[quote=引用 2 楼 qq_38206656 的回复:] table_test 何不创建成一张普通的表呢,反正最后还是被drop的。不是很理解GLOBAL TEMPORARY TABLE。我试了一下,就像1楼说的,你这个create global temporary table table_test as select * from (select id_p from plpl t minus select id_p from ll) 语句执行以后,查询了一下table_test数据,里面是空的,创建成普通的表可用。 http://blog.csdn.net/maoxiao1229/article/details/8166543
对对对,是的,改了之后确实可以用了...然而,第二次执行的话会显示‘名称已由现有对象使用’,那句drop并没有产生作用,请问大佬是什么原因啊 [/quote]看到你这个结果,第一想法是不是你的表名写错了,然后又一想会不会是commit放在drop后面造成的,但是写了一个cp试了一下,commit放在drop后面没有影响,又想会不会提示表存在不是指你dorp的表,但看到你的create就一个表名是固定的(不过不知道你后来改了没有),应该不会是这个原因。所有又觉得是你表名写错了。
imcmuc 2017-06-30
  • 打赏
  • 举报
回复
table_test 何不创建成一张普通的表呢,反正最后还是被drop的。不是很理解GLOBAL TEMPORARY TABLE。我试了一下,就像1楼说的,你这个create global temporary table table_test as select * from (select id_p from plpl t minus select id_p from ll) 语句执行以后,查询了一下table_test数据,里面是空的,创建成普通的表可用。 http://blog.csdn.net/maoxiao1229/article/details/8166543
卖水果的net 2017-06-30
  • 打赏
  • 举报
回复
exrcute immediate 创建临时表后,查一下,应该没有数据,你核对一下。
ohuo 2017-06-30
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
exrcute immediate 创建临时表后,查一下,应该没有数据,你核对一下。
对,是的,改成普通表就好了,但是第二次执行就提示‘名称已由现有对象使用’,应该是drop没有作用,但不知道该怎么下手...请大佬再看一看
ohuo 2017-06-30
  • 打赏
  • 举报
回复
引用 2 楼 qq_38206656 的回复:
table_test 何不创建成一张普通的表呢,反正最后还是被drop的。不是很理解GLOBAL TEMPORARY TABLE。我试了一下,就像1楼说的,你这个create global temporary table table_test as select * from (select id_p from plpl t minus select id_p from ll) 语句执行以后,查询了一下table_test数据,里面是空的,创建成普通的表可用。 http://blog.csdn.net/maoxiao1229/article/details/8166543
对对对,是的,改了之后确实可以用了...然而,第二次执行的话会显示‘名称已由现有对象使用’,那句drop并没有产生作用,请问大佬是什么原因啊
ohuo 2017-06-30
  • 打赏
  • 举报
回复
对对对,是的,改了之后确实可以用了...然而,第二次执行的话会显示‘名称已由现有对象使用’,那句drop并没有产生作用,请问大佬是什么原因啊

3,497

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧