0

我在使用 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 查询中应用排序。那么,为什么游标返回无序的数据,使用相同的查询呢?这种行为有“科学”的解释吗?

4

1 回答 1

8

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

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

于 2013-04-10T00:22:22.487 回答