У меня такое странное поведение при запросе с использованием базы данных 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-запросе. Итак, почему курсор возвращает неупорядоченные данные, используя тот же запрос? Есть ли «научное» объяснение такому поведению?

0
Javier Campo 10 Апр 2013 в 04:17

1 ответ

Лучший ответ

Ни в одном запросе нет предложения ORDER BY, поэтому порядок, в котором Oracle возвращает данные, является произвольным. Oracle может возвращать данные в любом порядке. И нет никакой гарантии, что вы получите такой же заказ со временем. Если вам важен порядок, в котором возвращаются данные, вы должны включить предложение ORDER BY.

Если углубиться в детали, я готов поспорить, что если вы посмотрите планы запросов для этих двух запросов, вы увидите, что Oracle применяет другой подход к удалению повторяющихся строк. Я предполагаю, что в запросе с использованием переменной привязки выполняется хеширование. Я предполагаю, что в запросе с использованием литерала выполняется сортировка. Конечно, это только предположение. Вам нужно будет опубликовать планы запросов, чтобы кто-нибудь был уверен.

8
Justin Cave 10 Апр 2013 в 04:22