使用动态sql删除重复记录的过程

Posted

技术标签:

【中文标题】使用动态sql删除重复记录的过程【英文标题】:procedure to delete duplicate records using dynamic sql 【发布时间】:2013-07-30 07:14:01 【问题描述】:

我已经成功实现了一个可以从表中删除重复记录的过程。 继续我正在进一步尝试使用动态 sql 概括这个过程但是我在编译自己时收到以下错误。

ERROR line 13, col 7, ending_line 14, ending_col 14, Found ''SELECT ROWID, ERR_MOD FROM '', Expecting: ( SELECT -or- WITH

这是我的代码:-


CREATE OR REPLACE PROCEDURE BIOCON.proc_dedup (
   p_tblname   IN     VARCHAR2,
   p_cname   IN varchar2,
   p_cvalue  IN varchar2,
   p_out          OUT VARCHAR2:=0
)
IS
   v_cnt   NUMBER;

CURSOR TMP IS 'SELECT ROWID, ERR_MOD FROM ' || p_tblname|| 'WHERE '|| p_cname '='||''p_cvalue ''; BEGIN BEGIN 'SELECT COUNT ( * ) INTO v_cnt FROM ' || p_tblname|| 'WHERE '|| p_cname' = '||''p_cvalue''; EXCEPTION WHEN OTHERS THEN p_out:=1; end;

FOR REC IN tmp LOOP IF v_cnt = 1 THEN EXIT; ELSE 'DELETE FROM '|| p_tblname|| 'WHERE ROWID = REC.ROWID'; END IF;

  v_cnt := v_cnt - 1;

END LOOP; EXCEPTION WHEN OTHERS THEN p_out := 2; END; /

【问题讨论】:

请Click Here查看我关于删除表中重复记录的帖子 【参考方案1】:

您好,您不能为普通游标创建动态查询,在这种情况下,您应该使用引用游标并按照以下步骤操作 --创建一个查询字符串 --打开引用光标 请使用 execute immediate 来执行删除语句...

CREATE OR REPLACE PROCEDURE BIOCON.proc_dedup (
   p_tblname   IN     VARCHAR2,
   p_cname   IN varchar2,
   p_cvalue  IN varchar2,
   p_out          OUT VARCHAR2:=0

 IS
   v_cnt   NUMBER;
   v_string varchar2(200);
   TYPE ref_cur IS REF CURSOR
   ref_cursor_name ref_cur;

BEGIN
      v_string:='SELECT ROWID, ERR_MOD FROM ' || p_tblname|| 'WHERE '|| p_cname    
      '='||''p_cvalue ''; 
  OPEN cursor_variable_name FOR v_string;
   .....
     .....


  EXECUTE IMMEDIATE 'DELETE FROM '|| p_tblname|| 'WHERE ROWID = REC.ROWID';--you need execute immediate for this

..... .....

【讨论】:

我在这里有两个不同的查询。如何用一个光标处理这两个?

以上是关于使用动态sql删除重复记录的过程的主要内容,如果未能解决你的问题,请参考以下文章

几个删除重复记录的SQL语句

Oracle删除重复记录只保留一条数据的几种方法

SQL语句删除重复的记录

sql中如何删除一个表中重复的记录?

sql查询重复记录删除重复记录方法大全

sql查询重复记录删除重复记录方法大全