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句を含める必要があります。

もう少し詳しく説明すると、これら 2 つのクエリのクエリ プランを見れば、Oracle が重複行を削除するために別のアプローチを取っていることがわかると思います。バインド変数を使用したクエリでは、ハッシュを行っていると思います。リテラルを使用したクエリでは、並べ替えを行っていると思います。もちろん、それは単なる推測です。誰でも確実にできるように、クエリプランを投稿する必要があります。

于 2013-04-10T00:22:22.487 に答える