2010-12-28 14 views
1

声明を11gの作品は、Oracle 9iのに取り組んでいるが、Oracle 11gはどこのデコードやサブクエリでさえ句を無視しているようにOracle 11gのサブクエリ9iのではなく、以下の

SELECT * 
FROM 
(
    SELECT 0 scrnfail_rate, '9' zz, 7 hh FROM DUAL 
    UNION ALL 
    SELECT 0 scrnfail_rate, '9' zz, 7 hh FROM DUAL 
) 
WHERE zz IS NOT NULL 
AND TO_CHAR (hh) NOT IN 
(
    SELECT 
     DECODE 
     (
      scrnfail_rate, 0, -1, 
       ROUND (LEVEL * 1/(scrnfail_rate/100)) 
       - 
       ROUND (1/(2 * (scrnfail_rate/100))) 
     ) AS nno 
    FROM DUAL 
    WHERE NVL (scrnfail_rate, 0) > 0 
    CONNECT BY LEVEL <= ROUND(9 * scrnfail_rate/100) 
) 

にそれは見えません。 このクエリは、Oracle 9iと同様に2行を返しますが、結果はOracle 11g EE 11.2.0.1.0 - 64bitのORA-01476: divisor is equal to zeroとなります。


誰でも手助けできますか?ありがとう!

+0

作品の両方の後にOracle 11gのバージョン11.2.0.2.0にアップグレードするかもしれません。 – Quassnoi

+0

DUALからたくさんのSELECTがあります。ストアドプロシージャなどの方がよいでしょう。 –

+0

クエリの実行計画を '9i'と' 11g'の両方に投稿してください。 – Quassnoi

答えて

0

残念ながら、私はそれを再現できません。

回避策として、これを試してみてください。

SELECT * 
FROM (
     SELECT 0 scrnfail_rate, '9' zz, 7 hh 
     FROM DUAL 
     UNION ALL 
     SELECT 0 scrnfail_rate, '9' zz, 7 hh 
     FROM DUAL 
     ) 
WHERE zz IS NOT NULL 
     AND TO_CHAR (hh) NOT IN 
     (
     SELECT DECODE 
       (
       scrnfail_rate, 0, -1, 
       ROUND (LEVEL * 1/(DECODE(scrnfail_rate, 0, 1, scrnfail_rate)/100)) - ROUND (1/(2 * (DECODE(scrnfail_rate, 0, 1, scrnfail_rate)/100))) 
       ) AS nno 
     FROM DUAL 
     WHERE NVL (scrnfail_rate, 0) > 0 
     CONNECT BY 
       LEVEL <= ROUND(9 * scrnfail_rate/100) 
     ) 
+0

それは動作しますが、それは厄介に見えます。助けてくれてありがとう。 – Zsuetam

5

私はこの問題を引き起こしていたのOracle 11.2.0.1.0にバグがあることがわかりました。

alter session set optimizer_features_enable='11.1.0.7' 

オプティマイザ機能の変更solvesthisの問題です。

2

あなたはこの問題に遭遇して、SQLスクリプトのからサブクエリを削除した場合、私はあなたがZsuetamsソリューションと使用で行くお勧めあなたのためのオプションではありません。あなたも、システム設定を変更したい場合があります

alter session set optimizer_features_enable='11.1.0.7'; 

Oracleインスタンスの自動設定このオプティマイザは限りデータベースがマウントされているように、すべてのセッションのために有効にとどまることを実行することによって、そう:ALTER SYSTEMシステム権限(たとえば、SYSユーザー)を持つユーザーとして

alter system set optimizer_features_enable='11.1.0.7' scope=both; 

このようなシステム全体の展開の副作用が懸念される場合は、 g。あなたはクラスタを実行していて、Oracleインスタンスのシステム設定による調整が他の人にも影響を及ぼす可能性があることを恐れています(そして、すべてを再テストするのは妥当ではありません)...次に、JNDIを拡張する方法を提供して、いくつかのSQL初期設定ステートメントを使用したDataSourceリソース設定。接続ファクトリは、このデータソースへの接続の作成中にこれらの文を一度実行します。

あなたはinitConnectionSqlsパラメータを使用例えばTomcatの7を使用している場合:

<Resource name="application.datasource" auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
[...] 
       initConnectionSqls="alter session set optimizer_features_enable=&apos;11.1.0.7&apos;" /> 

:あなたはDBCPを使用している場合> = 1.3.1/1.4.1を(まだリリースされていない)、あなたはDBCPのバージョン1.3および1.4では、JNDIオブジェクトファクトリ構成のこのプロパティの名前として「initConnectionSqls」を誤って使用するため、「initConnectionSqls」の代わりにパラメータ「connectionInitSqls」を使用する必要があります。

詳しくはApache Tomcat 7 - JNDI Resources HOW-TOApache Commons - Database Connection Pooling Configurationをご覧ください。

ああ、そして最後に:より良い解決策は、私のために `` 10g`と11g`上のすべての;-)