我试图使用外部表( 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上也没有用。
答案 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