我给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,稍后会报告。
为什么使用动态SQL?在你发布的例子中,关于查询的任何内容都是动态的,所以不需要使用动态SQL。您似乎在不使用绑定变量的情况下执行动态SQL这一事实比您使用游标遍历结果更加关注。你实际上是在用你获取的'ID'值做些什么?或者你只是数它们? – 2012-08-06 17:07:14
实际上有绑定变量,如日期和一些其他的东西,我没有在查询中提到(我把...)。这些ID将在稍后报告,如果SQL发现任何与计数(ID的数量) – 2012-08-06 17:09:14
因此,在实际的代码中,'date1'作为绑定变量传入而不是作为示例被硬编码到SQL语句中呢?我不确定'ID'值是否意味着'如果SQL发现有数据时会稍后报告'。你能详细解释一下吗? – 2012-08-06 17:15:41