Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL触发器未删除_Sql_Plsql - Fatal编程技术网

PL/SQL触发器未删除

PL/SQL触发器未删除,sql,plsql,Sql,Plsql,我遇到了以下问题,当我尝试测试这个触发器时,它不执行删除部分,其他部分工作正常已经测试过了,但是当删除不工作时,我做错了什么 create or replace trigger TR_RIESGO_COD_INT BEFORE INSERT OR DELETE OR UPDATE OF TIPO_MODELO, VALOR_SCORE ON SCOREO_INTERNO FOR EACH ROW DECLARE nExiste NUMBER; BEGIN SELECT COUN

我遇到了以下问题,当我尝试测试这个触发器时,它不执行删除部分,其他部分工作正常已经测试过了,但是当删除不工作时,我做错了什么

create or replace 
trigger TR_RIESGO_COD_INT
BEFORE INSERT OR DELETE OR UPDATE OF TIPO_MODELO, VALOR_SCORE
ON SCOREO_INTERNO 
FOR EACH ROW
DECLARE
nExiste NUMBER;
BEGIN
  
    SELECT COUNT(*)
    INTO nExiste
    FROM perfil_clientes
    where id_cliente = :NEW.ID_CLIENTE;
    
    if nExiste != 0 THEN
  
        IF INSERTING THEN 
        
            UPDATE PERFIL_CLIENTES
            SET CODIGO_RIESGO_INT = (SELECT RIESGO_CODIGO
                                FROM RANGO_SCOREO_INTERNO
                                WHERE TIPO_MODELO = :NEW.TIPO_MODELO
                                AND SCORE_DESDE <= :NEW.VALOR_SCORE
                                AND SCORE_HASTA >= :NEW.VALOR_SCORE)
            WHERE ID_CLIENTE = :NEW.ID_CLIENTE;
    
        ELSIF DELETING THEN
        
            UPDATE PERFIL_CLIENTES
            SET CODIGO_RIESGO_INT = NULL
            WHERE ID_CLIENTE = :NEW.ID_CLIENTE;
            
        ELSIF UPDATING THEN
            
            IF :NEW.VALOR_SCORE != :OLD.VALOR_SCORE OR :NEW.TIPO_MODELO != :OLD.TIPO_MODELO THEN 
            
                UPDATE PERFIL_CLIENTES
                SET CODIGO_RIESGO_INT = (SELECT RIESGO_CODIGO
                                FROM RANGO_SCOREO_INTERNO
                                WHERE TIPO_MODELO = :NEW.TIPO_MODELO
                                AND SCORE_DESDE <= :NEW.VALOR_SCORE
                                AND SCORE_HASTA >= :NEW.VALOR_SCORE)
                WHERE ID_CLIENTE = :NEW.ID_CLIENTE;
            
            END IF; 
    
        END IF;
    END IF;
END;
/

我不得不稍微修改一下代码,因为它是错误的,但现在它工作了,谢谢@nfgl

CREATE OR REPLACE
TRIGGER TR_RIESGO_COD_INT
BEFORE INSERT OR DELETE OR UPDATE OF TIPO_MODELO, VALOR_SCORE
ON SCOREO_INTERNO 
FOR EACH ROW
DECLARE
nExiste NUMBER;
BEGIN
    
    IF INSERTING THEN 
    
        SELECT COUNT(*)
        INTO nExiste
        FROM perfil_clientes
        WHERE id_cliente = :NEW.ID_CLIENTE;
        
        IF nExiste != 0 THEN

            UPDATE PERFIL_CLIENTES
            SET CODIGO_RIESGO_INT = (SELECT RIESGO_CODIGO
                                FROM RANGO_SCOREO_INTERNO
                                WHERE TIPO_MODELO = :NEW.TIPO_MODELO
                                AND SCORE_DESDE <= :NEW.VALOR_SCORE
                                AND SCORE_HASTA >= :NEW.VALOR_SCORE)
            WHERE ID_CLIENTE = :NEW.ID_CLIENTE;
            
        END IF;

    ELSIF DELETING THEN
    
        SELECT COUNT(*)
        INTO nExiste
        FROM perfil_clientes
        WHERE id_cliente = :OLD.ID_CLIENTE;
        
        IF nExiste != 0 THEN

            UPDATE PERFIL_CLIENTES
            SET CODIGO_RIESGO_INT = NULL
            WHERE ID_CLIENTE = :OLD.ID_CLIENTE;
            
        END IF;
        
    ELSIF UPDATING THEN
        
        
        SELECT COUNT(*)
        INTO nExiste
        FROM perfil_clientes
        WHERE id_cliente = :OLD.ID_CLIENTE;
        
        IF nExiste != 0 THEN

            IF :NEW.VALOR_SCORE != :OLD.VALOR_SCORE OR :NEW.TIPO_MODELO != :OLD.TIPO_MODELO THEN 
        
                UPDATE PERFIL_CLIENTES
                SET CODIGO_RIESGO_INT = (SELECT RIESGO_CODIGO
                                FROM RANGO_SCOREO_INTERNO
                                WHERE TIPO_MODELO = :NEW.TIPO_MODELO
                                AND SCORE_DESDE <= :NEW.VALOR_SCORE
                                AND SCORE_HASTA >= :NEW.VALOR_SCORE)
                WHERE ID_CLIENTE = :OLD.ID_CLIENTE;
        
            END IF; 
            
        END IF;

    END IF;
END;
/

请添加文本数据示例!请同时添加预期结果。还要标记您的数据库…我猜:NEW.ID\u CLIENTE在删除时为null,类似于:OLD.ID\u CLIENTE不为空。我已经尝试过了,同样的情况发生了idk@nfgl您是否也修改了将某些内容放入nExiste的查询?