找不到为什么要抛出NO_DATA_FOUND

时间:2016-03-09 16:35:23

标签: oracle plsql

我试图使用外部表( tClean ),使用此tClean表初始化的游标和循环删除表中的某些注册。 SELECT应该在视图中找到与光标值对应的行的id( LabelId )( SetLabelListVW )并将其放入我的变量 labelToDelete < / strong>即可。 DELETE之后应该删除表 SetLabel 中具有与labelToDelete对应的id的行。

问题是它为光标提取的每一行引发了NO_DATA_FOUND异常。顺便说一句,我应该删除的一些行确实出现在我的数据库中,其他行已经被简单的SQL指令删除了。

已验证变量名称,列名称。我已经尝试了许多不同的东西来找到解决方案,现在我怀疑行:

WHERE "LabelCode" = lcode
AND "TypeLabelCode" = ltype
AND "LabelText" = ltext;

这部分代码可能存在错误,但我现在不知道该怎么做。

这是代码:

SET SERVEROUTPUT ON

DECLARE

labelToDelete       NUMBER(9);
labelUsed           EXCEPTION;
PRAGMA EXCEPTION_INIT(labelUsed, -2292);
CURSOR  c IS SELECT * FROM tClean;
lcode   VARCHAR2(8);
ltype   VARCHAR2(8);
ltext   VARCHAR2(50);

BEGIN

OPEN c;
LOOP
    FETCH c INTO lcode, ltype, ltext;
    EXIT WHEN c%NOTFOUND;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('lcode : ' || lcode);
        DBMS_OUTPUT.PUT_LINE('ltype : ' || ltype);
        DBMS_OUTPUT.PUT_LINE('ltext : ' || ltext);
        SELECT DISTINCT "LabelId" INTO labelToDelete
        FROM "SetLabelListVW"
        WHERE "LabelCode" = lcode
        AND "TypeLabelCode" = ltype
        AND "LabelText" = ltext;

        DELETE FROM "SetLabel"
        WHERE "SetLabelId" = labelToDelete;

        DBMS_OUTPUT.PUT_LINE('Suppression du label Id : ' || labelToDelete || '  Label : ' || ltext);
        EXCEPTION

        WHEN labelUsed THEN
            DBMS_OUTPUT.PUT_LINE('Exception ORA-2292 : le label ne peut être supprimé.');
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('Exception ORA-01403 (NO_DATA_FOUND) : le label n''existe pas.' || ltext);
    END;
END LOOP;
CLOSE c;
--COMMIT;

 END;

这就是结果:

lcode : 00000195
ltype : MODSET
ltext : prout
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.prout
lcode : 00000189
ltype : MODSET
ltext : pouet
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.pouet
lcode : 00000169
ltype : MODSET
ltext : POUET POUET
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.POUET POUET
lcode : 00000181
ltype : MODSET
ltext : pouet
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.pouet
lcode : 00000182
ltype : MODSET
ltext : pouet
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.pouet
lcode : 00000191
ltype : MODSET
ltext : pouet
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.pouet
lcode : 00000183
ltype : MODSET
ltext : pouet 123
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.pouet 123
lcode : CHARTEST
ltype : ACTPARAM
ltext : Caract�stique �ester
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.Caract�stique     �ester
lcode : 00000022
ltype : MODSET
ltext : TEST bf
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.TEST bf
lcode : 00000323
ltype : MODSET
ltext : test fp
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.test fp
lcode : 00000008
ltype : MODSET
ltext : testghdgklh
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.testghdgklh
lcode : CARAC
ltype : STEPCO
ltext : Caract�stique test
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.Caract�stique test
lcode : TEST
ltype : CARACT
ltext : Dossier de test
Exception ORA-01403 (NO_DATA_FOUND) : le label n'existe pas.Dossier de test

为什么我在数据存在时会收到该异常?

编辑:tClean,SetLabelListW的描述和tClean的创建请求。

desc tClean;
Nom                                       NULL ?   Type
----------------------------------------- -------- ----------------------------
LABELCODE                                          VARCHAR2(8)
TYPELABELCODE                                      VARCHAR2(8)
LABELTEXT                                          VARCHAR2(50)


desc "SetLabelListVW";
Nom                                       NULL ?   Type
----------------------------------------- -------- ----------------------------
SetLabelLanguageId                        NOT NULL NUMBER(9)
LabelId                                            NUMBER(9)
TypeLabelId                                        NUMBER(9)
TypeLabelCode                                      VARCHAR2(8 CHAR)
SetLabelTypeId                            NOT NULL NUMBER(9)
CategoryLabelId                                    NUMBER(9)
OrdipatLabelCode                                   VARCHAR2(8 CHAR)
LabelCode                                          VARCHAR2(8 CHAR)
LabelText                                          VARCHAR2(50 CHAR)
CommentText                                        VARCHAR2(300 CHAR)
LongLabelText                                      VARCHAR2(100 CHAR)
SetLanguageId                             NOT NULL NUMBER(9)
SortNumber                                         NUMBER(5)
LanguageLabelCode                                  VARCHAR2(8 CHAR)
OrigineLanguageId                         NOT NULL NUMBER(9)
LastUpdateDate                                     DATE


CREATE TABLE tClean (
LabelCode VARCHAR2(8), 
 TypeLabelCode VARCHAR2(8), 
 LabelText VARCHAR2(50)
)
ORGANIZATION EXTERNAL
(
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY SYNCFILES
  ACCESS PARAMETERS
  (
    RECORDS DELIMITED BY NEWLINE
    SKIP 1
    CHARACTERSET UTF8
    DNFS_ENABLE
    DNFS_READBUFFERS 10
    FIELDS TERMINATED BY ';'
    MISSING FIELD VALUES ARE NULL
    (
      LabelCode,
      TypeLabelCode,
      LabelText     
    )
  )
  LOCATION ('cleanLabel.csv')
)
PARALLEL 1
REJECT LIMIT UNLIMITED;

我怀疑编码问题。 我的csv是UTF-8,我的外部表是UTF-8,Oracle bdd是ALT32UTF8。 或者,外部表请求中的某些访问参数会导致pl / sql代码出现问题。 我不知道。我有点失落。

新编辑:

似乎以下简单请求适用于SQL Developer但不适用于SQL Plus。

SELECT DISTINCT "LabelId"
        FROM "SetLabelListVW"
        WHERE trim("LabelCode") = 'CHARTEST'
        AND trim("TypeLabelCode") = 'ACTPARAM'
        AND trim("LabelText") = 'Caractéristique à tester';

SQL Developer:LabelId = 100172209 SQL Plus:aucunelignesÚlectionnÚe(编码问题)

问题顶部的整个代码在SQL Dev上既没有在SQL Dev上也没有用。

2 个答案:

答案 0 :(得分:0)

可以肯定它无法在SetLabelListVW中找到数据。

尝试使用

SELECT DISTINCT "LabelId" INTO labelToDelete
FROM "SetLabelListVW"
WHERE trim("LabelCode") = trim(lcode)
AND trim("TypeLabelCode") = trim(ltype)
AND trim("LabelText") = trim(ltext);

这样,您可以确定您的表中包含数据,问题可能是表中的空格。

答案 1 :(得分:0)

出于某种原因,tClean最后一列中的数据(仅在此列上)在结尾处有一个隐藏字符,即使在修剪功能之后也是如此。 我能够在sql Developper上看到这个字符!= NULL。

select substr(LabelText, 6, 1)
from tClean
where LabelText like '%prout%';

结果:“ “

select substr(LabelText, 7, 1)
from tClean
where LabelText like '%prout%';

结果:NULL