2011-12-21 22 views
0

プロシージャでビューを作成する際に問題が発生します。これは、Oracleが指定した列の順序を無視するためです。Oracleビューの列の順序は無視されます

は、私は私が選択する前/*+ORDERED */を追加しようとしましたが、これで問題が解決しないEXECUTE IMMEDIATE textOfCommand;

実行ビューの終わりに、(すべてのループ1つのビューで)ループ内でビューを作成するためのコマンドのテキストを作成します。 (手続きからではなくクエリを直接実行しようとしました)

生成されたコマンド自体は良いですし、column_idでも良いですが、oracleの開発者やgeomediaでは無視されます。私は、これはクエリのいくつかの結合があるので、これはクエリの最適化と何かになると思います。

私はちょうどそれが予測できない理由を理解できません。時には時々良い(ときどき同じコマンドを何回か実行すると)ビューに依存せず、絶対にランダムであり、理由は何ですか。 アイデアがあれば、それを共有してください。おかげ

EDIT:

私は列(いない行)の順に問題を持っているオラクルの開発者ともgeomediaに示されています。 Oracle Developerで[Columns]タブをクリックすると、aは良好なCOLUMN_IDのビューのすべての列を表示できますが、この列では順序付けられません。私はそれが単なる方法だと思っていました。オラクルの開発者はそれを表示しますが、他のソフトウェアもそれに問題があります。 selectコマンドを実行すると、その順序は良好です。私はoracleデベロッパーの注文​​に気をつけませんが、問題は顧客のソフトウェア(geomedia)です。

プロシージャによって作成され、プロシージャの各ループの最後にEXECUTE IMMEDIATEコマンドで実行される生成されたSQLの例です。 : (何か約100などのビューがあるテーブル、カラムと注文このすべてを指定する1つの構成テーブルから取られ、私が参加すべきことであるが、FKとテーブルを識別するためにGDOSYS.GPICKLISTSを使用している。。)

CREATE OR REPLACE FORCE VIEW "SOME_VIEW" AS 
SELECT /*+ORDERED */ a.ID AS "ID", 
a8.TEXT_EN AS "COLUMN_NAME_1", 
a.COLUMN_NAME_2 AS "COLUMN_NAME_2", 
a.COLUMN_NAME_3 AS "COLUMN_NAME_3", 
to_char(a.COLUMN_NAME_4,'yyyymmdd') AS "COLUMN_NAME_4", 
to_char(a.COLUMN_NAME_5,'yyyymmdd') AS "COLUMN_NAME_5", 
to_char(a.COLUMN_NAME_6,'yyyymmdd') AS "COLUMN_NAME_6", 
to_char(a.COLUMN_NAME_7,'yyyymmdd') AS "COLUMN_NAME_7", 
a.COLUMN_NAME_8 AS "COLUMN_NAME_8", 
a.COLUMN_NAME_9 AS "COLUMN_NAME_9", 
a.COLUMN_NAME_10 AS "COLUMN_NAME_10", 
to_char(a.COLUMN_NAME_11,'yyyymmdd') AS "COLUMN_NAME_11", 
a9.TEXT_EN AS "COLUMN_NAME_12", 
a10.TEXT_EN AS "COLUMN_NAME_13", 
a.COLUMN_NAME_14 AS "COLUMN_NAME_14", 
a11.TEXT_EN AS "COLUMN_NAME_15", 
FROM SOME_TABLE a 
LEFT JOIN IENC.TABLE1 a8 on a8.id = a.COLUMN_NAME_1 
LEFT JOIN IENC.TABLE2 a9 on a9.id = a.COLUMN_NAME_12 
LEFT JOIN IENC.TABLE3 a10 on a10.id = a.COLUMN_NAME_13 
LEFT JOIN IENC.TABLE4 a11 on a11.id = a.COLUMN_NAME_15 
+3

EXECUTE IMMEDIATEの結果とともにCREATE VIEW文を投稿できますか? – Aaron

+6

列の順序や行の順序について話していますか? –

+4

また、ランダムなヒントを追加する前に、ドキュメントを確認することをお勧めします。 ORDEREDヒントは、OracleにFROM句に表示される順序でテーブルを結合するように指示します。 http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#sthref668 –

答えて

0

私は「予測不可能」であるものを前提とは、あなたには、いくつかの列で行を注文したい場合は、明示的ORDER BY句を追加する必要があります

SELECT column_name, data_type, column_id 
FROM user_tab_cols 
WHERE table_name = 'SOME_VIEW'; 

のようなものです。

SELECT column_name, data_type, column_id 
FROM user_tab_cols 
WHERE table_name = 'SOME_VIEW' 
ORDER BY column_id; 
0

カラムの名前を二重引用符で囲まないでください。

SELECT /*+ORDERED */ a.ID AS "ID", => SELECT /*+ORDERED */ a.ID AS ID, 
関連する問題