2012-08-06 61 views
2

我给SQL很少的输入,我需要得到所有的ID和他们的计数,不符合要求的标准。在Oracle 10g中的SQL过程中使用游标的任何替代方法?

我想知道是否有任何使用光标的替代品。

DECLARE 
    v_count   INTEGER; 
    v_output   VARCHAR2 (1000); 
    pc     table1%ROWTYPE; 
    unmarked_ids  EXCEPTION; 
    dynamic_sql  VARCHAR (5000); 
    cur    SYS_REFCURSOR; 
    id     pp.id%TYPE; 
    pos    INTEGER; 
BEGIN 
    v_count := 0; 
    SELECT * 
    INTO pc 
    FROM table1 
    WHERE id = '&ID'; 
    DBMS_OUTPUT.ENABLE; 
     dynamic_sql := 
      'SELECT ID from pp 
        WHERE (TO_CHAR(cdate, ''yyyy/mm/dd'') = 
        TO_CHAR (:a, ''yyyy/mm/dd'')) 
        AND aid IN (SELECT aid FROM ppd WHERE TO_CHAR(cdate, ''yyyy/mm/dd'') = 
        TO_CHAR (:b, ''yyyy/mm/dd'') 
        AND cid = :c) 
        AND cid <> :d'; 
     OPEN cur FOR dynamic_sql USING pc.cdate, pc.cdate, pc.id, pc.id; 
     LOOP 
     FETCH cur INTO id; 
     EXIT WHEN cur%NOTFOUND; 
     v_count := v_count + 1; 
     DBMS_OUTPUT.PUT_LINE (' Id:' || id); 
     END LOOP; 
     CLOSE cur; 
    IF (v_count > 0) 
    THEN 
     DBMS_OUTPUT.PUT_LINE ('Count: ' || v_count || ' SQL: ' || dynamic_sql); 
     RAISE unmarked_ids; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE('SQL ended successfully'); 
EXCEPTION 
    WHEN unmarked_ids 
    THEN 
     DBMS_OUTPUT.put_line (
     'Found ID's that not marked with the current id.'); 
    WHEN NO_DATA_FOUND 
    THEN 
     DBMS_OUTPUT.put_line (
     'No data found in table1 with the current id ' || '&ID'); 
END; 

查询中存在绑定变量。其中之一是约会,还有三个。 需要显示计数和ID,稍后会报告。

+1

为什么使用动态SQL?在你发布的例子中,关于查询的任何内容都是动态的,所以不需要使用动态SQL。您似乎在不使用绑定变量的情况下执行动态SQL这一事实比您使用游标遍历结果更加关注。你实际上是在用你获取的'ID'值做些什么?或者你只是数它们? – 2012-08-06 17:07:14

+0

实际上有绑定变量,如日期和一些其他的东西,我没有在查询中提到(我把...)。这些ID将在稍后报告,如果SQL发现任何与计数(ID的数量) – 2012-08-06 17:09:14

+0

因此,在实际的代码中,'date1'作为绑定变量传入而不是作为示例被硬编码到SQL语句中呢?我不确定'ID'值是否意味着'如果SQL发现有数据时会稍后报告'。你能详细解释一下吗? – 2012-08-06 17:15:41

回答

1

您可以将rowid与索引值(0 ... n)一起存储在临时表中,然后使用while循环遍历索引值并使用rowid连接到实际表。

+0

声明:我不是说这是个好主意!这只是我见过的一种方法... – 2012-08-06 18:02:42

+0

我之前使用过这种方法,它可以工作并且比光标快,但带有一些健康警告 – SlackGadget 2016-04-07 10:16:15