Hamish Whittal wrote:
> Inserting into db: cardTypePollID = 20
> cardType => $VAR1 = {
>           'compID' => '17',
>           'asnNumber' => '.1.3.6.1.4.1.9.3.6.11.1.2',
>           'results' => {
>                          '1' => 'cpu-2600',
>                          '2' => 'wic-s-t-2186',
>                          '3' => 'pm-16a'
>                        }
>         };
>
> My Perl code...then output:
>    my $plsql_params = "'" . join("', '", $ASNNameHash->{compID},
> $pollID, $answer, $asnNum) . "'" ;
>    my $sql = qq{BEGIN
> DEVICE_MANAGEMENT.ADD_COMPONENTDETAILS($plsql_params); END;};

 Better to use placeholders/bind variables, but that shouldn't be a problem
in this particular case.

>    print qq(\n*$sql*\n) if $debug;
>    $sth = $$dbh->prepare($sql); # End of the prepare
>    $sth->execute();
>    $PassFail = ( ! ( defined ($sth->err) ) ) ? 'PASS' : 'FAIL';
>    write OUT_DETAIL if $debug;
> }
>
> OUTPUT:
>
>     -> prepare for DBD::Oracle::db (DBI::db=HASH(0x359190)~0x32f3f4
> 'BEGIN DEVICE_MANAGEMENT.ADD_COMPONENTDETAILS('17', '20', 'cpu-2600',
> '.1.3.6.1.4.1.9.3.6.11.1.2.1'); END;')
>     dbih_setup_handle(DBI::st=HASH(0x4a5088)=>DBI::st=HASH(0x4a448c),
> DBD::Oracle::st, 4a4510, Null!)
>     dbih_make_com(DBI::db=HASH(0x32f3f4), DBD::Oracle::st, 208)
>     dbd_st_prepare'd sql BEGIN
>     dbd_describe skipped for BEGIN
>     <- prepare= DBI::st=HASH(0x4a5088) at OraMod.pm line 415 via
> ./NetAssetMan.pl line 105
>     -> execute for DBD::Oracle::st (DBI::st=HASH(0x4a5088)~0x4a448c)
>     dbd_st_execute BEGIN (out0, lob0)...
>     dbd_st_execute BEGIN returned (SUCCESS, rpc1, fn34, out0)
>     <- execute= 1 at OraMod.pm line 416 via ./NetAssetMan.pl line 105
>     -> err for DBD::Oracle::st (DBI::st=HASH(0x4a5088)~0x4a448c)
>     <- err= undef at OraMod.pm line 417 via ./NetAssetMan.pl line 105
>
> No update occurs even though it returns a success from the BEGIN...
> Then, I cut-n-paste from the above output...the BEGIN....END;
> stuff.... i.e. BEGIN DEVICE_MANAGEMENT.ADD_COMPONENTDETAILS('17',
> '20', 'cpu-2600', '.1.3.6.1.4.1.9.3.6.11.1.2.1'); END;
>
> and viola, it works. So my original impression that is could be with
> the PL/SQL is no longer true; well sortof, read on. The PL/SQL seems
> to work fine, only not when I call it from perl. Could it be that I
> am running an 'old' version of DBD::Oracle ??? I am running 1.12 and
> I think the latest is 1.14. Oracle Version 9.2.0.1, sun solaris 8 and
> perl 5.6.1 built for sun-4 solaris. Here is my PL/SQL that I thought
> was dodgy (marked with ->)....
>         OPEN check_ComponentDetails(p_ComponentID, p_ASNNumber);
>         FETCH check_ComponentDetails INTO v_answer;
>         IF check_ComponentDetails%NOTFOUND THEN
>                 INSERT INTO ComponentDetails
> (yadda,yadda,......);
> ->        ELSIF (v_answer != p_Answer) THEN
> ->                UPDATE ComponentDetails
> ->                SET     answer          = p_answer,
> ->                       PollingID       = p_PollingID
> ->                WHERE   ComponentID     = p_ComponentID
> ->                  AND   ASNNumber       = p_ASNNumber;
> ->        END IF;
>
> Funny thing here though. If I squeeze a floating point number thru the
> comparison above (v_answer != p_answer) then it catches the difference
> every time. It only does not seem to work when injecting strings
> and.... then only from perl.
>
> Funny one. Any help gladly accepted....

 Just eliminating the obvious - have you COMMITted?

-- 
Andy Hassall ([EMAIL PROTECTED]) icq(5747695) (http://www.andyh.co.uk)
Space: disk usage analysis tool (http://www.andyhsoftware.co.uk/space)

Reply via email to