【问题标题】:procedure to delete duplicate records using dynamic sql使用动态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查看我关于删除表中重复记录的帖子

标签: sql plsql dynamic-sql


【解决方案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

..... .....

【讨论】:

  • 我在这里有两个不同的查询。如何用一个光标处理这两个?
猜你喜欢
  • 2016-01-07
  • 2010-10-24
  • 2016-09-17
  • 2020-07-16
  • 2021-02-13
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多