Oracle Database 11g:oe.orders表不存在

时间:2012-08-24 20:42:41

标签: database oracle

我尝试在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;

ERROR:

> 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

1 个答案:

答案 0 :(得分:2)

首先,您不应该将任何对象创建为SYSSYS是Oracle的架构 - 只有Oracle创建的对象才应放在该架构中。虽然它可能不是您特定问题的原因,但是当您SYS时,各种功能的行为与您作为普通用户时的行为不同 - 这是避免使用SYS架构的另一个原因。

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

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

第三,如果要在用户A拥有的过程或函数中查询用户OE拥有的表(在本例中为B)(无论您决定使用哪个用户)而不是SYS),过程的所有者必须直接被授予访问权限,而不是通过角色。如果表存在,则SYS只能通过角色DBA访问该表,而不是直接访问。这可以防止SYS拥有引用该表的函数。要解决此问题,您需要以A身份登录并将SELECT访问权限授予B。因此,作为OE,您需要

GRANT SELECT ON oe.orders TO <<user that will own the function>>