通过REF CURSOR和SQL查询检索数据以不同的顺序显示数据

时间:2013-04-10 00:17:16

标签: sql oracle

我在使用Oracle 10g数据库的查询中有这种奇怪的行为。

我调用包中包含的存储过程:

SQL> VAR RC REFCURSOR
SQL> EXEC MyPackage.MyProcedure('ATLANTICO', :RC )

PL/SQL procedure successfully completed.

SQL> PRINT RC
--prints the data
LURUACO
TUBARA
CGTO SALGAR
ALPES DE SEVILLA
MANATI
SOLEDAD
USIACURI
CGTO SANTA CRUZ
PONEDERA
CGTO JUAN MINA
PALMAR DE VARELA
PIOJO
SANTA LUCIA
BARRANQUILLA
POLONUEVO
REPELON
SANTO TOMAS
SUAN
JUAN DE ACOSTA
BARANOA
MALAMBO
PUERTO COLOMBIA
SABANALARGA
CGTO PATILLA
GALAPA
SABANAGRANDE
CAMPO DE LA CRUZ
EDUARDO SANTOS (LA PLAYA)

这是包中存储过程的定义:

PROCEDURE MyProcedure(iDEPTO IN VARCHAR2,oCURSOR OUT MYREFCUR) IS
BEGIN
OPEN oCURSOR FOR
select distinct city from MyTable where state=iDEPTO;
END;

如果我在包外面执行查询,这就是我得到的:

SQL> select distinct city from MyTable where state='ATLANTICO';

--data retrieved
ALPES DE SEVILLA
BARANOA
BARRANQUILLA
CAMPO DE LA CRUZ
CGTO JUAN MINA
CGTO PATILLA
CGTO SALGAR
CGTO SANTA CRUZ
EDUARDO SANTOS (LA PLAYA)
GALAPA
JUAN DE ACOSTA
LURUACO
MALAMBO
MANATI
PALMAR DE VARELA
PIOJO
POLONUEVO
PONEDERA
PUERTO COLOMBIA
REPELON
SABANAGRANDE
SABANALARGA
SANTA LUCIA
SANTO TOMAS
SOLEDAD
SUAN
TUBARA
USIACURI
28 rows selected.

正如您所看到的,我既不在存储过程也不在SQL查询中应用排序。那么,为什么游标使用相同的查询返回无序数据呢?对这种行为有“科学”的解释吗?

1 个答案:

答案 0 :(得分:8)

两个查询都没有ORDER BY子句,因此Oracle发生返回数据的顺序是任意的。 Oracle以任何顺序返回数据完全有效。并且无法保证您会随着时间的推移获得相同的订单。如果您关心返回数据的顺序,则必须包含ORDER BY子句。

进一步了解详细信息,我敢打赌,如果你查看这两个查询的查询计划,你会发现Oracle正在采取不同的方法来删除重复的行。在使用bind变量的查询中,我的猜测是它正在执行哈希。在使用文字的查询中,我的猜测是它正在进行排序。当然,这只是猜测。您需要发布查询计划供任何人确定。