Hier ist ein Auszug aus einigen PL/SQL-Code, ich glaube, ein PL/SQL-Fehler zeigt:Ist das ein PL/SQL-Fehler?
if guid_ is null then
dbms_output.put_line('guid_ is null: ' || guid_);
end if;
Wenn diese Zeilen ausgeführt werden, es
guid_ is null: 07D242FCC55000FCE0530A30D4928A21
druckt ich auf Oracle 11R2 am
select * from v$version;
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
Ich kann dies mit den folgenden Typen und anonymen Block reproduzieren. Sorry für die Länge, aber ich glaube ich es nicht mehr verkürzen kann:
auchcreate type tq84_t as table of varchar2(32);
/
create type tq84_o as object (
dummy number(1),
not final member procedure clear
) not final;
/
show errors
create type tq84_d under tq84_o (
g varchar2(32),
constructor function tq84_d return self as result,
overriding member procedure clear
);
/
show errors
create package tq84_h as
t tq84_t;
end tq84_h;
/
show errors
create package body tq84_h as
begin
t := tq84_t();
end;
/
show errors
create type body tq84_o as
member procedure clear is begin
null;
end clear;
end;
/
create type body tq84_d as
constructor function tq84_d return self as result is
begin
g := sys_guid;
return;
end tq84_d;
overriding member procedure clear is begin
tq84_h.t.extend;
tq84_h.t(tq84_h.t.count) := g;
g := null;
end clear;
end;
/
show errors
declare
b tq84_o; -- Change to tq84_d ...
guid_ varchar2(32);
begin
b := new tq84_d;
guid_ := treat(b as tq84_d).g;
b.clear;
if guid_ is null then
dbms_output.put_line('guid_ is null: ' || guid_);
end if;
end;
/
drop type tq84_t;
drop type tq84_d;
drop type tq84_o;
drop package tq84_h;
Beachten Sie, dass, wenn ich b tq84_o
-b tq84_d
ändern, tritt der Fehler nicht mehr auftreten.
Kann jemand überprüfen, ob dies auch auf anderen Systemen geschieht?
Ich bin mir nicht sicher, warum dies noch nicht der Fall ist, aber wenn 'b tq84_o' in' b tq84_d' geändert wird, wird 'guid_' nicht-null, wenn die 'if'-Bedingung ausgewertet wird. Das Hinzufügen einer "else" -Anweisung, die eine ähnliche Aussage ausgibt, bestätigt dies. – Allan
Ich habe gerade festgestellt, dass der Fehler ist, dass "wenn guid_ null ist" evaluiert, um wahr, nicht dass der 'dbms_output' einen Wert zurückgibt, wenn die Variable null sein sollte. – Allan
Darüber hinaus bewirkt das Hinzufügen eines "else", dass die Version mit "b tq84_o" wie erwartet funktioniert. – Allan