0

Oracle Database 11g で単純な関数を作成しようとしましたが、次のエラーが表示されます。oe.orders テーブルが見つからなかったようです。助けてください!

ありがとう!

コード:

--Create following function as SYS
CREATE OR REPLACE FUNCTION get_bal(acc_no IN NUMBER)
  RETURN NUMBER
  IS acc_bal NUMBER(11,2);
  BEGIN
    SELECT oe.orders.order_total
    INTO acc_bal
    FROM oe.orders
    WHERE oe.orders.customer_id = acc_no;
    RETURN(acc_bal);
  END;
/

SELECT get_bal(170) AS Balance FROM dual;

エラー:

> ORA-06575: Package or function GET_BAL is in an invalid state
> 06575. 00000 -  "Package or function %s is in an invalid state"
> *Cause:    A SQL statement references a PL/SQL function that is in an
>            invalid state. Oracle attempted to compile the function, but
>            detected errors.
> *Action:   Check the SQL statement and the PL/SQL function for syntax
>            errors or incorrectly assigned, or missing, privileges for a
>            referenced object. Error at Line: 28 Column: 7
4

1 に答える 1

2

まず、 としてオブジェクトを作成しないでくださいSYSSYSOracle のスキーマです。Oracle が作成するオブジェクトのみをそのスキーマに配置する必要があります。それはおそらくあなたの特定の問題の原因ではありませんが、さまざまな機能の動作が、通常のユーザーの場合とは異なります。これは、スキーマSYSの使用を避けるもう 1 つの理由です。SYS

次に、テーブルはoe.orders存在しますか? このOEスキーマは、Oracle データベースに同梱されているサンプル スキーマの 1 つです。特定のデータベースに存在する場合と存在しない場合があります。スキーマが存在しない場合は、インストール手順を説明します。それ以外の場合、問題はパーミッションの 1 つにある可能性があります。テーブルが存在するかどうかわからない場合、これは行を返しますか?

SELECT owner, table_name
  FROM dba_tables
 WHERE owner = 'OE'
   AND table_name = 'ORDERS'

第 3 に、ユーザーA(この場合は ) が所有するテーブルに対して、ユーザー (ではなく使用することを決定したユーザー)OEが所有するプロシージャまたは関数でクエリを実行する場合は、プロシージャの所有者にテーブルへのアクセス権が付与されている必要があります。ロール経由ではなく直接。テーブルが存在する場合、直接アクセスするのではなく、ロールを介してのみテーブルにアクセスできる可能性があります。これにより、テーブルを参照する関数を所有できなくなります。これを修正するには、 としてログインし、テーブルへのアクセスを に許可する必要があります。したがって、次のようにする必要がありますBSYSSYSDBASYSASELECTBOE

GRANT SELECT ON oe.orders TO <<user that will own the function>>
于 2012-08-24T20:58:43.437 に答える