Avatar billede Lasse Novice
12. juni 2001 - 00:16 Der er 13 kommentarer og
1 løsning

Hvordan kalder man et procedure i oracle fra et script

Jeg har lavet en PL/SQL procedure, og denne vil jeg gerne kalde fra et perlscript... Kan det lade sig gøre?

Avatar billede ehf Nybegynder
12. juni 2001 - 07:34 #1
Hej Gooky

Prøv om du kan få dette til at virke.

use DBI;
##Connect to database
my $dbh = DBI->connect(\"dbi:Oracle:host=$HOST;sid=$SID;port=1521\", $USER, $PSWD) || die \"Cannot access Oracle\\n\";
$dbh->{RaiseError} = 0;
$dbh->func(100000, \'dbms_output_enable\');

my $statement = $dbh->prepare(q{
  declare tmp varchar2(2000);
  begin
    tmp := function.call(:PARAM);
  end;
    });
    $statement->bind_param(\":PARAM\", $param);
    if ($statement->execute()) {
    $tmp = $dbh->func(\"dbms_output_get\");
    print OUT \"Result $tmp\";
    };

$dbh->disconnect();
Avatar billede Lasse Novice
12. juni 2001 - 17:12 #2
ok, det vil jeg prøve...
Avatar billede Lasse Novice
12. juni 2001 - 17:13 #3
hvis man laver en raise, kommer det så som output i $tmp variablen?
Avatar billede ehf Nybegynder
12. juni 2001 - 17:20 #4
Nej. Jeg mangler vist også lidt.
Du skal efter tmp := func....
have en dbms_output.put_line(tmp);

en eventuel raise vil du kunne fange i en else del på
if ($statement->execure()) {
  det gik godt;
}else{
  det gik ikke godt;
}
Avatar billede Lasse Novice
12. juni 2001 - 17:24 #5
hmm, jeg har lige prøvet og jeg får en uventet fejl:

no listener (DBD error: OCIServerAttach)

Jeg kunne forestille mig at jeg har glemt at starte en process(på port 1521 - standard formoder jeg). Hvordan starter man lige den? Jeg er på en unix maskine...
Avatar billede ehf Nybegynder
12. juni 2001 - 19:51 #6
Er du sikker på at listener processen lytter på port 1521
Avatar billede Lasse Novice
12. juni 2001 - 20:06 #7
ok nu har jeg fundet ud af at starte den... så prøver jeg lige scriptet senere
Avatar billede Lasse Novice
13. juni 2001 - 01:23 #8
hmmm, jeg kan kalde en procedure, men jeg kan ikke fange de raise\'s jeg har lavet... nogen ideer?
Avatar billede Lasse Novice
13. juni 2001 - 01:42 #9
jeg har lavet en lille procedure her....:

create procedure test as
hej exception;
begin
raise hej;
exception
when others then
dbms_output.put_line(\'hello world\');
end;
/

Mit perlscript ser således ud:

use DBI;
$dbh = DBI->connect(\"dbi:Oracle:dbname\",\'login\', \'pw\') or die \"LORT\";

$dbh->{RaiseError} = 1;
$sth = $dbh->prepare(qq{
begin
test;
end;
}
) or die \"LORT2\";

print \"LORT3\" unless $sth->execute;
my $msg = $dbh->func( \'plsql_errstr\' );
print $msg, \"\\n\";
print $DBI::errstr, \"\\n\";
print $dbh->errstr, \"\\n\";
print $dbh->err, \"\\n\";

$dbh->disconnect;

Ja, det var perl scriptet... Jeg skriver alle de fejlvariabler ud som jeg tror der kan ligge information i, men jeg får intet ud.... Jeg ved at jeg kører proceduren, så det er ikke det som er fejlen... NOGEN IDEER?????
Avatar billede Lasse Novice
13. juni 2001 - 02:11 #10
jeg har nu gjort således:

set serverout off

også kan jeg vha.

$dbh->func( 100000,\'dbms_output_enable);

@text = $dbh->func(\'dbms_output_get\');
print @text;

få de ting ud som jeg skriver vha dbms_output.put_line, men det er en lidt ondsvag måde at teste for om der fejl syntes jeg....

Avatar billede Lasse Novice
13. juni 2001 - 02:15 #11
hmm serverout delen er vist lige meget....
Avatar billede ehf Nybegynder
13. juni 2001 - 07:32 #12
Desværre. Jeg har ikke prøvet at fange disse exceptions uden for pl/sql delen.
Avatar billede Lasse Novice
13. juni 2001 - 17:42 #13
ok, den opretter jeg så som et seperat spg. Tak for hjælpen.
Avatar billede Lasse Novice
06. juli 2001 - 00:47 #14
hmm
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester