简体   繁体   English

pl/sql-oracle,插入前触发。 从 select 更新一些值

[英]pl/sql-oracle, trigger before insert. Update some values from a select

I'm new to oracle and I'm stuck with a trigger that needs to update some values before inserting the row, those values need to be obtained from a select.我是 oracle 的新手,我遇到了一个需要在插入行之前更新一些值的触发器,这些值需要从 select 获取。 I'm confused when to use NO_DATA_FOUND or SQL%FOUND to prevent the no data found exception in the select statements, particularly in the select that obtains multiple values and some of them can be null and some don't.我很困惑何时使用 NO_DATA_FOUND 或 SQL%FOUND 来防止 select 语句中的 no data found 异常,特别是在获得多个值的 select 中,其中一些可能是 Z37A6259CC0C1DAFFAE2999CC0C1DAFFAE2999A7

This is the code I have right now, but I'm getting an error:这是我现在拥有的代码,但出现错误:

create or replace NONEDITIONABLE TRIGGER IS_INSERT_OSCILOSPROTECCION_RELE 
BEFORE INSERT ON IS_OSCILOSPROTECCION 
referencing OLD as old NEW as new
FOR EACH ROW

DECLARE 
    v_IDMODELORELE VARCHAR2(50);
    v_IDRELE VARCHAR2(50);
    v_NOMBRERELE VARCHAR2(50);
    v_DESCRIPCIONRELE VARCHAR2(200);
    v_NUMEROSERIERELE VARCHAR2(50);

BEGIN
    BEGIN
        select IDRELE into v_IDRELE from IS_PROTECCION where IDPROTECCION = :new.IDPROTECCION;
    EXCEPTION WHEN NO_DATA_FOUND THEN
        v_IDRELE := NULL;
    END;
    
    IF v_IDRELE is not null THEN

        select IDMODELORELE, NOMBRE, DESCRIPCION, NUMEROSERIE into v_IDMODELORELE, v_NOMBRERELE, v_DESCRIPCIONRELE, v_NUMEROSERIERELE from RELE where IDRELE = v_IDRELE;
        IF SQL%FOUND THEN            
            :new.IDMODELORELE := v_IDMODELORELE;
            :new.NOMBRERELE := v_NOMBRERELE;
            :new.DESCRIPCIONRELE := v_DESCRIPCIONRELE;
            :new.NUMEROSERIERELE := v_NUMEROSERIERELE;
        END IF;
        
    END IF;
END;

Error report - ORA-00604: error occurred at recursive SQL level 1 ORA-12954: The request exceeds the maximum allowed database size of 12 GB.错误报告 - ORA-00604: 递归 SQL 级别 1 发生错误 ORA-12954: 请求超过允许的最大数据库大小 12 GB。 00604. 00000 - "error occurred at recursive SQL level %s" 00604. 00000 - “错误发生在递归 SQL 级别 %s”

You're most likely using the XE version of Oracle, and you have attempting to exceed the maximum amount of data it supports.您很可能使用的是 XE 版本的 Oracle,并且您试图超过它支持的最大数据量。 There's nothing wrong with your trigger - you just don't have room for more data, so the insert fails.您的触发器没有任何问题 - 您只是没有空间容纳更多数据,因此插入失败。

You will need to delete some data from the same table, or reduce the size of the tablespace by freeing up other unused space.您将需要从同一个表中删除一些数据,或者通过释放其他未使用的空间来减小表空间的大小。 The following article has ideas on how to reclaim unused space: https://oracle-base.com/articles/misc/reclaiming-unused-space以下文章有关于如何回收未使用空间的想法: https://oracle-base.com/articles/misc/reclaiming-unused-space

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM