如何在Oracle 18c中通过用户定义的过程访问HR架构对象?

如何在Oracle 18c中通过用户定义的过程访问HR架构对象?,oracle,plsql,procedure,Oracle,Plsql,Procedure,我已经给出了当我尝试创建一个user1过程时得到的代码和错误消息。我尝试访问Oracle XE 18c中示例hr模式中的employees表。我可以知道如何通过用户定义的过程访问hr架构对象吗 CREATE OR REPLACE PROCEDURE proc_1 IS v_name hr.employees.first_name%TYPE; v_num NUMBER; BEGIN SELECT first_name INTO v_name FROM hr.employees WHERE empl

我已经给出了当我尝试创建一个user1过程时得到的代码和错误消息。我尝试访问Oracle XE 18c中示例hr模式中的employees表。我可以知道如何通过用户定义的过程访问hr架构对象吗

CREATE OR REPLACE PROCEDURE proc_1 IS
v_name hr.employees.first_name%TYPE;
v_num NUMBER;
BEGIN
SELECT first_name INTO v_name FROM hr.employees
WHERE employee_id=100;
v_num:=5;
DBMS_OUTPUT.PUT_LINE('test'||v_name);
DBMS_OUTPUT.PUT_LINE(v_num);
END;
 /
警告:创建的过程存在编译错误

SQL> show errors
Errors for PROCEDURE PROC_1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/8      PL/SQL: Item ignored
2/8      PLS-00201: identifier 'HR.EMPLOYEES' must be declared
5/1      PL/SQL: SQL Statement ignored
5/39     PL/SQL: ORA-00942: table or view does not exist
7/1      PL/SQL: Statement ignored
7/38     PLS-00320: the declaration of the type of this expression is
         incomplete or malformed

您需要将对HR对象的访问权限授予用户user1

作为用户HR连接:

grant select on employees to user1;

您需要直接为
hr.employees
提供
select grant

从HR用户,您需要执行:

grant select on employees to user1;
PL/SQL
程序(
procedure/function/etc..
)在定义人的权限下执行时,将不考虑通过角色授予您的用户
人力资源员工

子程序中角色的使用取决于它是否以 定义者权限或调用者权限。在定义者权限子程序中, 所有角色都被禁用

可以在Oracle文档中找到它


干杯

我已将select授予一个角色,并将该角色分配给user1user1。Ser1可以直接访问hr架构对象,如下所示。但无法通过用户从hr.employees创建的SQL>SELECT COUNT()过程访问;COUNT()------------107为了能够从存储过程而不是通过角色访问表,您需要直接授权。