Function in PL/SQL (Oracle 8)

Hi,

Ich möchte aus dem Pfad c:\database\cosd07am\TS_USER00.ORA den Teil „c:\database\cosd07am“ herausfiltern. Aber irgendwie funktioniert das nicht, weil ich wahrscheinlich an substr nen falschen Wert übergebe. Wenn ich es per Hand mit sql auf der Console mache, funktioniert es. Kann jemand helfen??

create or replace function pfadfilter(in_filename_mit_pfad IN VARCHAR2)
return varchar2 is
pos_letzter_slash binary_integer;
filename_ohne_pfad varchar2(32);
begin

pos_letzter_slash:=instr(in_filename_mit_pfad,’’, -1);
filename_ohne_pfad:=substr(in_filename_mit_pfad,1,pos_letzter_slash);
return filename_ohne_pfad;
end;
/

select pfadfilter(member) from v$logfile;

Gruss Tina

hi!

ich hab die funktion eingespielt und sie funktioniert prächtig

allerdings:

select pfadfilter(member) from v$logfile;

welchen wert besitzt „member“??

grüße,
tomh

Hi thomh,

ich hab schonmal so ne ähnliche Funktion geschrieben, daher kann ich mir nicht erklären warum es nicht tut. Wenn ich also folgenden select mache, kommt der darunterligende Fehler:

SQL> select pfadfilter(member) from v$logfile;
select pfadfilter(member) from v$logfile
*
FEHLER in Zeile 1:
ORA-00904: Ung³ltiger Spaltenname

member ist ein varchar2(513)

Gruß Tina

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

(schuß ins blaue)

SQL> select pfadfilter(member) from v$logfile;
select pfadfilter(member) from v$logfile

berechtigungen gesetzt?

grüße,
tomh

Hi,

wieso Berechtigungen gesetzt?? Bin als sys angemeldet und hab die gleiche Funktion schon vorher angewendet, mit dem Unterschied, dass bei dem substr dass drinsteht. Und das funktioniert ohne Probleme.

filename_ohne_pfad:=substr(in_filename_mit_pfad,pos_letzter_slash+1);

daher… keine Ahnung woran es liegt. Müsste nämlich eigentlich gehen.

Gruss Tina

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

welcher user hat die funktion kreiert? welcher user greift die funktion zu? und welche berechtigungen haben diese user?

wieso Berechtigungen gesetzt?? Bin als sys angemeldet

und stell das schleunigst ab!! sys bleibt sys und schnaps bleibt schnaps - sys, system und internal sollten nur zum starten und stoppen, zum einspielen von system-objekten etc. da sein, und nicht um eigene objekte zu erstellen …

zum eigentlichen problem: ich habe deine funktion auch eingespielt und genauso mittels select (allerdings mit hardcodierten string) aufgerufen und es funktionierte ohne probleme

ev. doch mit anderem user und den entsprechenden berechtigungen?

grüße,
tomh

Hi Tomh,

Also ich versteh das
nicht ganz mit den Berechtigungen. Die function hab ich einfach in nem
Sql-Editor erstellt. Was hat das denn mit den den usern zu tun??? hä? Und wo
hab ich ein eigenes Objekt erstellt??? Gnade, ich bin noch purer Anfänger und
gerade mal im 3.Semester meines Informatikstudiums :wink:.

Und was ist ein hardcodierter string??

ok, ich kann es noch mit nem anderen user probieren, vielleicht tut es ja
dann. Das Ding macht mich langsam wahnsinnig.

Gruss tina

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

Die function hab ich einfach in nem
Sql-Editor erstellt.

als welcher user hast du die function erstellt? als welcher user bist du in den sql-editor reingekommen?

Was hat das denn mit den den usern zu
tun??? hä?

ein user hat eine tabelle, ein anderer eine function, ein dritter eine view … und solange ein user seine sachen nicht freigibt („granted“), schauen die anderen user durch die finger, wenn sie „fremde“ sachen mal benötigen

Und wo hab ich ein eigenes Objekt erstellt???

create or replace function

Und was ist ein hardcodierter string??

select fun_get_path(‚c:\blabla\bla\bla‘) from dual;
– und zwar das unter einfachem hochkomma

ein beispiel:
der user scott (mit dem password „tiger“ :wink: hat die funktion fun_get_path(pathname in varchar2) return varchar2); der user tomh möchte nun diese funktion verwenden, hat aber keine rechte darauf, also macht der user scott ganz einfach im sql-plus ein:

SQL>grant execute on fun_get_path to tomh;

wenn nun tomh die funktion aufrufen will, macht er entweder ein

SQL>select scott.fun_get_path(‚c:\blabla\bla\bla‘) from dual;

oder er (könnte aber auch scott machen, wenn’s public werden sollte) legt sich ein synonym an

SQL>create synonym fun_get_path for scott.fun_get_path;

nun kann tomh ein einfaches

SQL>select fun_get_path(‚c:\blabla\bla\bla‘) from dual;

absetzen

grüße,
tomh

ps: der insulanische oracle-link ist in der brettbeschreibung angegeben

Hi,

ok, verstehe.
Hab aber den Editor nicht aus der shell aufgerufen. Benutze scite und hab da das Ding erstellt, einfach abgespeichert und aus der shell das Skript über den Pfad aufgerufen. Momentan gibt es nämlich keine anderen user ausser system, sys und internel, da dies eine Testdatenbank ist. Und ich bin eigentlich fast immer als sys angemeldet.
Ich habe keine Ahnung wie man das granted.
Mein eigentliches Probelm liegt darin, dass mein Betreuer möchte, dass ich eine Funktion/Skript schreiben, dass überprüft, ob auf der Platte genug Platz ist, wenn man eine DB dort hinveschiebt. Daher wollte ich erst den Pfad herausfinden und über BS-Befehle die Größe der DB ermitteln und mit dem freien Platz auf der Platte vergleichen, dann ne Fehlermeldung ausgeben. Ein leichterer Weg fällt mir leider nicht ein. Und ich muss das ding in 2 Wochen fertig haben ;-(.

Gruss Tina

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]