我給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