2012-08-06 57 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