我尝试在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
答案 0 :(得分: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
拥有的过程或函数中查询用户OE
拥有的表(在本例中为B
)(无论您决定使用哪个用户)而不是SYS
),过程的所有者必须直接被授予访问权限,而不是通过角色。如果表存在,则SYS
只能通过角色DBA
访问该表,而不是直接访问。这可以防止SYS
拥有引用该表的函数。要解决此问题,您需要以A
身份登录并将SELECT
访问权限授予B
。因此,作为OE
,您需要
GRANT SELECT ON oe.orders TO <<user that will own the function>>