查看写个oracle存储过程.

longai123 2012-09-20 05:16:18
. 某语音电话本表信息如下:
Call_book_info
MOBILE_ID 移动号码 VARCHAR2(12)
CALLIN_TIME 呼入时间 Date
CALLOUT_TIME 呼出时间 Date
STATUS 状态 CHAR(1)

在某次大批量操作后,数据记录达到100万,MOBILE_ID估计有2万个重复,现要求删除重复的号码(只保留一条),因为该表是业务表,删除时不能影响业务的正常使用。编写存储过程实现删除重复号码的功能。
要求如下:
(1) 为保证删除的数据以后可查,在删除时要先做备份,备份不成功则不能进行删除。
(2) 要有日志记录,比如删除所花时间,删除成功了多少条,失败多少条等操作信息。
(3) 如果出现性能问题,要跟踪原因。生成trace文件进行分析,改进程序。


俺写了个过程.
create or replace procedure fuck
begin
declare v_exists number;
--begin
select count(*) into v_exists from user_tables where table_name = 'TEST1';
if v_exists > 0 then
execute immediate 'drop table TEST1';
end if;
-- end;
-- begin
execute immediate '
create table test1(
mobile_id varchar2(12),
callin_time date,
callout_time date,
status char(1)
)';
commit;
--end;
insert into test1(mobile_id,callin_time,callout_time,
status)
select * from Call_book_info;
commit;
delete from Call_book_info where mobile_id
not in (select min(mobile_id) from call_book_info);
end;
不知哪里出错了.求解.谢谢
没有oracle 基础;
...全文
152 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdczrplxy 2014-08-29
  • 打赏
  • 举报
回复 1
引用 6 楼 longai123 的回复:
我有建新的表test1来存储业务表 这相当于复制了业务表. delete from Call_book_info where mobile_id not in (select min(mobile_id) from call_book_info); 删除了重复的记录. 我的思路是这样想的. 望请教.
----挖坟挖到的。。 你用后边的select min(mobile_id) from call_book_info查看下有多少条记录?没错就1条!这句话的意思是把其他的都删除,只留一条ID最小的...我擦,好狠啊
longai123 2012-09-21
  • 打赏
  • 举报
回复
我有建新的表test1来存储业务表 这相当于复制了业务表.
delete from Call_book_info where mobile_id
not in (select min(mobile_id) from call_book_info);
删除了重复的记录.
我的思路是这样想的.
望请教.
ssqtjffcu 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
. 某语音电话本表信息如下:
Call_book_info
MOBILE_ID 移动号码 VARCHAR2(12)
CALLIN_TIME 呼入时间 Date
CALLOUT_TIME 呼出时间 Date
STATUS 状态 CHAR(1)

在某次大批量操作后,数据记录达到100万,MOBILE_ID估计有2万个重复,现要求删除重复的号码(只保留一条),因为该表是业务表,删除时……
[/Quote]

你的过程根本跟你的要求不满足,你不是删除重复的号码,也没有做备份记录,实现增量备份,删除
铁歌 2012-09-20
  • 打赏
  • 举报
回复
1存储过程的语法格式为:
create or replace procedure fuck
is
--变量声明;
begin
--过程主体;
end fuck;
2. 如果存储过程代码无误,可以通过 "/" 来执行代码,编译存储过程。
3.通过exec 或 execute 来调用编译后的存储过程。
人生无悔 2012-09-20
  • 打赏
  • 举报
回复

exec fuck;
--或
begin
fuck;
end;
longai123 2012-09-20
  • 打赏
  • 举报
回复
问下pl/sql developer 如何执行存储过程...
人生无悔 2012-09-20
  • 打赏
  • 举报
回复

create or replace procedure fuck
is--此处少了is或as
--begin--声明变量要出现在begin end块前
--declare --存储过程中不用declare
v_exists number;
begin--
select count(*) into v_exists from user_tables where table_name = 'TEST1';
if v_exists > 0 then
execute immediate 'drop table TEST1';
end if;
-- end;
-- begin
execute immediate '
create table test1(
mobile_id varchar2(12),
callin_time date,
callout_time date,
status char(1)
)';
--commit;--创建表属ddl语句,不需要commit;
--end;
insert into test1(mobile_id,callin_time,callout_time,
status)
select * from Call_book_info;
commit;
delete from Call_book_info where mobile_id
not in (select min(mobile_id) from call_book_info);
end;
/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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