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

首先,您不应该将任何对象创建为SYS. SYS是 Oracle 的模式——只有 Oracle 创建的对象应该放在该模式中。尽管这可能不是您的特定问题的原因,SYS但是当您是任何普通用户时,各种功能的行为会有所不同——这是避免使用SYS模式的另一个原因。

其次,表是否oe.orders存在?该OE模式是 Oracle 数据库附带的示例模式之一。它可能存在也可能不存在于任何特定数据库中。如果架构不存在,我们可以引导您完成安装。否则,问题可能是权限之一。如果您不确定该表是否存在,这会返回任何行吗?

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

第三,如果您想在用户拥有的过程或函数中查询用户拥有的表A(在这种情况下) (无论您决定使用哪个用户而不是),则必须已授予该过程的所有者对该表的访问权限直接不是通过角色。如果表存在,则很可能只能通过角色而不是直接访问来访问表。这可以防止拥有引用该表的函数。要解决此问题,您需要以身份登录并授予对表的访问权限。所以,因为,你需要OEBSYSSYSDBASYSASELECTBOE

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