本来想把图片贴出来的,可是因为贴图有问题,所以只能描述了:在PL/SQL Developer或直接登录Oracle客户端/服务器,修改数据时出现这样的问题:
ora-20595: no data found in single select.
ora-06512: at "TEST.TR_U_COMPONENT", line 60
ora-04088: error during excution of trigger 'TEST.TR_U_COMPONENT'下面是出现问题的语句:
WHEN NO_DATA_FOUND THEN
  raise_application_error (-20595, 'No data found in a single select.');
但是在另外一个客户端软件(INtools)软件中,可以直接修改的。
不知道为什么,请各位大虾帮忙解释一下,谢谢。

解决方案 »

  1.   

    'TEST.TR_U_COMPONENT'是一個trigger吧?把它的代碼貼出來看看
      

  2.   

    前面产生 NO_DATA_FOUND错误
    应该是前一个select语句没有返回需要的结果吧
      

  3.   

    昨天不是发了  不是要你贴出触发器TEST.TR_U_COMPONENT的代码 
      

  4.   

    Create Or Replace Trigger TR_U_COMPONENT
    Before update on COMPONENT
    For each row 
    Declare nresult integer;
            cresult char(1);
            prf_dim char(1);
            sFlg char(1);
            iCnt int;
            nDwgId int;
            n_out number;
    Begin
      P_pause_triggers(n_Out);
      If n_Out = 1 Then
        Return;
      End If;-- ### According to Doron G. for Telecom module,  ###
    -- ### assisted by Boris P.,  12-Mar-2001         ###
       IF UPDATING THEN
         If :old.TC_LINE_NUMBER_ID <> :new.TC_LINE_NUMBER_ID Then
           Update panel set tc_line_number_id = :new.TC_LINE_NUMBER_ID
           where panel_id = (select panel_id from panel_component
                             where cmpnt_id = :new.CMPNT_ID);
         End If;
       END IF;
    -- ##################################################  If (Nvl(length(rtrim(ltrim(:new.re1))),0) <> 0)
         Or (Nvl(length(rtrim(ltrim(:new.re2))),0) <> 0)
         Or (Nvl(length(rtrim(ltrim(:new.re3))),0) <> 0)
         Or (Nvl(length(rtrim(ltrim(:new.re4))),0) <> 0)
         Or (Nvl(length(rtrim(ltrim(:new.re5))),0) <> 0)
         Or (Nvl(length(rtrim(ltrim(:new.cmpnt_note))),0) <> 0) Then
        :new.cmpnt_find_rem := 1;
      End if;
      If (Nvl(length(rtrim(ltrim(:new.re1))),0) = 0)
         and (Nvl(length(rtrim(ltrim(:new.re2))),0) = 0)
         and (Nvl(length(rtrim(ltrim(:new.re3))),0) = 0)
         and (Nvl(length(rtrim(ltrim(:new.re4))),0) = 0)
         and (Nvl(length(rtrim(ltrim(:new.re5))),0) = 0)
         and (Nvl(length(rtrim(ltrim(:new.cmpnt_note))),0) = 0) Then
        :new.cmpnt_find_rem := NULL;
      End if;
      If :old.master_cmpnt_id > 0 then     -- according to Ramzi Haddad
        return;
      End If;-- ### BPoliako according to ITokar (adding CASE_ID), 04-May-2004 ###
      IF :NEW.plant_id <> 0 THEN
        FOR rec IN (Select dwg_id from spec_sheet_data
                    where cmpnt_id = :OLD.cmpnt_id and cmpnt_id > 0)
        LOOP
         IF rec.dwg_id > 0 THEN
           iCnt := NULL;
           SELECT count(*) INTO iCnt
           FROM package_drawing WHERE dwg_id = rec.dwg_id;
           IF iCnt > 0 THEN
             UPDATE package_drawing SET chg_flag = 'Y'
             WHERE dwg_id = rec.dwg_id;
           END IF;
           IF :NEW.instr_pd_flg = 4 OR :NEW.instr_pd_flg=1 THEN
             UPDATE package_drawing SET release_flag = 'N'
             WHERE dwg_id = rec.dwg_id;
           END IF;
         END IF;
        END LOOP;
      END IF;
    -- ####################################################################  if :new.cmpnt_name <> :old.cmpnt_name then
        p_rename_tag (:new.cmpnt_id,:old.cmpnt_name,:new.cmpnt_name,nresult);
      end if;
      Select prf_dimension into prf_dim
      from component_function_type
      where cmpnt_func_type_id = :old.cmpnt_func_type_id;
      IF prf_dim = 'Y' THEN
        select dim_remedy_type_flg into cresult
        from project where proj_id = :old.proj_id;    If :old.cmpnt_mfr_id <> :new.cmpnt_mfr_id Or :old.cmpnt_mod_id <> :new.cmpnt_mod_id  Then
          UPDATE component_dimensional SET suspect_flg = 'Y', ready_flg = 'N',
            ENG_PROJ_ID = :old.ENG_PROJ_ID, ENG_REF_ID = :old.ENG_REF_ID
          WHERE cmpnt_id = :old.cmpnt_id;      INSERT INTO dimensional_suspect
           (dim_suspect_id, dim_suspect_desc, susp_number,
            cmpnt_id, proj_id, plant_id,site_id, area_id,
            unit_id, user_name, chg_date, chg_num,
            chg_status,ENG_PROJ_ID,ENG_REF_ID)
           VALUES (Seq_Next_Id.NEXTVAL,
             'Change in Manufacturer or Model',0,
             :old.cmpnt_id, :old.proj_id, :old.plant_id,
             :old.site_id, :old.area_id, :old.unit_id,
             :old.user_name, SYSDATE,:old.chg_num,
             :old.chg_status,:old.ENG_PROJ_ID,:old.ENG_REF_ID);
          UPDATE component_dimensional SET suspect_flg = 'Y',
            ENG_PROJ_ID = :old.ENG_PROJ_ID, ENG_REF_ID = :old.ENG_REF_ID
          WHERE cmpnt_id = :old.cmpnt_id;
        End If;    If :old.cmpnt_func_type_id <> :new.cmpnt_func_type_id Then
          sFlg := '1';
        End If;    if sFlg = '1' Then
          If cresult  = '1' Then
            UPDATE component_dimensional SET
             dim_grp_udfn01 = to_number(''),
             dim_grp_udfn02 = to_number(''),
             dim_grp_udfn03 = to_number(''),
             dim_grp_udfn04 = to_number(''),
             dim_grp_udfn05 = to_number(''),
             dim_grp_udfn06 = to_number(''),
             dim_grp_udfn07 = to_number(''),
             dim_grp_udfn08 = to_number(''),
             dim_grp_udfn09 = to_number(''),
             dim_grp_udfn10 = to_number(''),
             dim_grp_udfn11 = to_number(''),
             dim_grp_udfn12 = to_number(''),
             dim_grp_udfn13 = to_number(''),
             dim_grp_udfn14 = to_number(''),
             dim_grp_udfn15 = to_number(''),
             dim_grp_udfn16 = to_number(''),
             dim_grp_udfn17 = to_number(''),
             dim_grp_udfn18 = to_number(''),
             dim_grp_udfn19 = to_number(''),
             dim_grp_udfn20 = to_number(''),
             dim_grp_udfn21 = to_number(''),
             dim_grp_udfn22 = to_number(''),
             dim_grp_udfn23 = to_number(''),
             dim_grp_udfn24 = to_number(''),
             dim_grp_udfn25 = to_number(''),
             dim_grp_udfn26 = to_number(''),
             dim_grp_udfn27 = to_number(''),
             dim_grp_udfn28 = to_number(''),
             dim_grp_udfn29 = to_number(''),
             dim_grp_udfn30 = to_number(''),
             ENG_PROJ_ID = :old.ENG_PROJ_ID,
             ENG_REF_ID = :old.ENG_REF_ID
            where cmpnt_id = :old.cmpnt_id;
          End If;      UPDATE component_dimensional
           SET suspect_flg = 'Y', ready_flg = 'N',
           ENG_PROJ_ID = :old.ENG_PROJ_ID,
           ENG_REF_ID = :old.ENG_REF_ID
          WHERE cmpnt_id = :old.cmpnt_id;
          INSERT INTO dimensional_suspect
            (dim_suspect_id, dim_suspect_desc, susp_number,
             cmpnt_id, proj_id, plant_id, site_id, area_id,
             unit_id, user_name, chg_date, chg_num,
             chg_status,ENG_PROJ_ID,ENG_REF_ID)
           VALUES (Seq_Next_Id.NEXTVAL,
                   'Change in Instrument Type', 0,
             :old.cmpnt_id, :old.proj_id, :old.plant_id,
             :old.site_id, :old.area_id, :old.unit_id,
             :old.user_name,SYSDATE, :old.chg_num,
             :old.chg_status,:old.ENG_PROJ_ID,:old.ENG_REF_ID);
        End If;
      End if;    /* IF  prf_dim = 'Y'  */
    EXCEPTION
     WHEN NO_DATA_FOUND THEN
      raise_application_error (-20595, 'No data found in a single select.'); WHEN TOO_MANY_ROWS THEN
      raise_application_error (-20594, 'Too many rows in a single select.');
     WHEN OTHERS THEN
      raise_application_error (-20593, 'Other errors during execution of the trigger.');
    End ;
      

  5.   

    樓主,你確定下面這句有相應數據嗎?  Select prf_dimension into prf_dim
      from component_function_type
      where cmpnt_func_type_id = :old.cmpnt_func_type_id;
      

  6.   


    sorry,什么相应数据?哦,说明一下,语句是自动生成的,不是手写的,我是全盘拷贝过来的
      

  7.   

    应该是你update某条数据的时候,component_function_type里没有对应的记录,导致select into 出错.
    select into 之前最好先select count(*) 一下,确认有且只有一条记录再select into 
      

  8.   

    可是为什么在客户端终端软件(Intools)中久不报错呢,而且还可以执行?我用Access来链接也是出现同样的错误。
      

  9.   

    谢谢大家的回复,disable这个trigger就可以直接修改了。但是,不知道会不会对Table数据的完整性有影响不?我想就一个简单的数据,也不是什么主键或外键的,应该不会吧。