2

SQL にいくつかの入力を与え、必要な基準を満たさないすべての ID とその数を取得する必要があります。

カーソルの使用に代わるものがあるかどうか知りたいです。

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;

クエリにはバインド変数があります。そのうちの 1 つは日付で、あと 3 つあります。カウントと ID を表示する必要があり、後で報告されます。

4

1 に答える 1

1

行 ID をインデックス値 (0...n) と共に一時テーブルに格納し、while ループを使用してインデックス値を調べ、行 ID を使用して実際のテーブルに結合することができます。

于 2012-08-06T17:09:30.340 に答える