10

Oracle (10g) ストアド プロシージャを調べていると、次のLEFT/RIGHT関数が見つかりました。

TO_DATE(LEFT('01-Jun-1201',9))

Toad エディターでは、この機能を実行できず、次のように変更する必要があります。LPAD

TO_DATE(LPAD('01-Jun-1201',9))

ストアド プロシージャはLEFT/RIGHT関数で正常に実行されますが、 / を使用するとより高速にLPAD実行されますRPAD

LEFTOracleに関数はありますか?そうでない場合、ストアドプロシージャが正常に実行されるのはなぜですか?

SELECT
    SUM(DECODE(SIGN(TO_DATE(LEFT('01-Jun-12', 9)) - TO_DATE(logdate)),
               -1, totaltime, 0, totaltime, 0)) AS totaltime
  FROM AREA2.v_area
  WHERE logdate >= TO_DATE(RIGHT('01-Jun-12', 9))
    AND logdate <= TO_DATE('30-Jun-12')
4

3 に答える 3

8

Oracle には文書化された LEFT() 関数はありません。 フルセットはこちら.

おそらくあなたが持っているのはユーザー定義関数です。これは、データ ディクショナリをクエリすることで簡単に確認できます。

select * from all_objects
where object_name = 'LEFT'

しかし、なぜストアド プロシージャが機能し、クエリが機能しないのかという疑問があります。考えられる解決策の 1 つは、ストアド プロシージャが、LEFT() 関数も所有する別のスキーマによって所有されていることです。プロシージャに対する権限は付与されていますが、その依存関係は付与されていません。これが機能するのは、ストアド プロシージャがデフォルトで DEFINER 権限で実行されるためです。そのため、ストアド プロシージャをその所有者であるかのように実行できます。

その場合、上に挙げたデータ ディクショナリ クエリは役に立ちません。権限のあるオブジェクトの行のみが返されます。その場合、ストアド プロシージャの所有者としてクエリを実行するか、代わりに DBA_OBJECTS をクエリする権限を持つユーザーとして接続する必要があります。

于 2012-07-03T10:58:06.670 に答える