在Oracle 10g中,除了在SQL过程中使用游标之外,还有其他选择吗?

在Oracle 10g中,除了在SQL过程中使用游标之外,还有其他选择吗?,sql,plsql,oracle10g,Sql,Plsql,Oracle10g,我只给SQL一些输入,我需要获得所有不满足所需条件的ID及其计数 我想知道是否有任何替代使用游标的方法 查询中有绑定变量。其中一个是date,还有三个。 需要显示计数和ID,稍后会报告。您可以将rowid与索引值0…n一起存储在临时表中,然后使用while循环遍历索引值并使用rowid连接到实际表。为什么要使用动态SQL?在您发布的示例中,关于查询的任何内容都不是动态的,因此不需要使用动态SQL。您似乎在不使用绑定变量的情况下执行动态SQL,这一事实比使用游标在结果上进行迭代更令人担忧。您是否真

我只给SQL一些输入,我需要获得所有不满足所需条件的ID及其计数

我想知道是否有任何替代使用游标的方法

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

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

为什么要使用动态SQL?在您发布的示例中,关于查询的任何内容都不是动态的,因此不需要使用动态SQL。您似乎在不使用绑定变量的情况下执行动态SQL,这一事实比使用游标在结果上进行迭代更令人担忧。您是否真的在使用您获取的ID值执行某些操作?或者你只是在计算它们?实际上有绑定变量,比如date和其他一些我在查询中没有提到的东西。如果SQL找到任何具有ID计数的ID,则稍后将报告这些ID。因此,在实际代码中,date1作为绑定变量传入,而不是像您的示例那样硬编码到SQL语句中?我不确定,如果SQL找到任何带有计数的ID值,那么以后报告ID值意味着什么。你能更详细地解释一下吗?是的,在实际的SQL中有绑定变量。这些ID将提供给UC4作业,如果该作业找到任何ID,则该作业将失败。然后产品支持团队将看到这些ID并修复问题。这些ID仅显示用于支持PROD support team.OK,那么实际代码看起来与修改后的示例不同,实际上使用的是绑定变量?什么是UC4作业?这段代码如何为该作业提供它找到的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;