【问题标题】:ORACLE Is possible to execute a store procedure from a trigger?ORACLE 是否可以从触发器执行存储过程?
【发布时间】:2020-05-20 23:50:03
【问题描述】:

ORACLE 是否可以从触发器执行存储过程?

您好,我正在尝试从触发器执行存储过程。 我已经测试了存储过程,它工作正常:

EXECUTE ESCRIBE_INVENTARIO;

然后我创建触发器:

CREATE OR REPLACE TRIGGER REPORTUSER.VENTA_ECOMMERCE 
AFTER UPDATE ON  INVOICE FOR EACH ROW

BEGIN
ESCRIBE_INVENTARIO;
END;
/

但是当我编译它时,我得到了这个错误:

触发 VENTA_ECOMMERCE 编译

LINE/COL  ERROR
--------- -------------------------------------------------------------
2/1       PL/SQL: Statement ignored
2/1       PLS-00201: identifier 'ESCRIBE_INVENTARIO' must be declared
Errores: comprobar log de compilador

我不知道如何声明存储过程。

这是存储过程的头部,没有过程体。

CREATE OR REPLACE PROCEDURE ESCRIBE_INVENTARIO
IS
    EXISTE NUMBER; -- CREACIÓN DE LA VARIABLE QUE VERIFICA SI YA SE GENERO EL INVENTARIO DIARIO

    BEGIN

    SELECT (SELECT COUNT(BANDERA_CONTROL) FROM REPORTUSER.CONTROL_INVENTARIO_V WHERE TRUNC(FECHA) = TRUNC(SYSDATE) AND BANDERA_CONTROL = 1) INTO EXISTE FROM DUAL;

        IF EXISTE = 0 THEN

...

【问题讨论】:

  • 过程ESCRIBE_INVENTARIO是否创建在架构中:REPORTUSER

标签: oracle stored-procedures triggers


【解决方案1】:

是的,绝对可以从触发器执行一个过程。

我能想到的唯一原因是 REPORTUSER 无权访问该过程。

尝试授予reportuser执行权限

grant execute on ESCRIBE_INVENTARIO to REPORTUSER;

并在触发器代码中将所有者名称放在过程名称之前,例如

begin
  owner.escrive_inventario;
end;

所有者的名字可以从 dba_objects 中获取

select owner, object_name from dba_objects where object_name = 'ESCRIBE_INVENTARIO';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2011-09-30
    • 2011-11-07
    相关资源
    最近更新 更多