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