15. juli 2003 - 20:16Der er
17 kommentarer og 2 løsninger
Problemer med at slette procedures og functions i pl/sql
Har fået at vide at man kan slette procedures og functions i pl/sql, ved at skrive: DROP FUNCTION funktionsnavn; DROP PROCEDURE procedurenavn;
Men når jeg gør det, så får jeg en fejlmelding. Jeg får at vide at den function/procedure, jeg forsøger at slette, ikke findes. Jeg har checket at den ligger i bufferen, via "list", så det er ikke det der er problemet. Har forsøgt at slette både med og uden ext. sql. Når jeg forsøger med ext. sql, får jeg følgende at vide: "utilstrækkelige privilegier".
Er ikke helt klar over hvad du mener med extensions ? Det skal du slet ikke bruge i en drop kommando ? Extensions bruges kun når du kalder en extern fil med et script i ala sqlplus>@c:\test.sql
Tror dit problem er at du forsøger at droppe en procedure som er ejet af en anden bruger end den du er logget ind som.
Prøver at forklare det simpelt .... Lad os sige at din procedure hedder TEST og at den er eget af MYTH. Så skal du skrive: drop procedure myth.test;
Hvis du forsøger at droppe en andens object, uden at have rettigheder til det - vil du få en "utilstrækkelige privilegier"
Husk fremover at skrive den fejlkode du evt. får - ala ora-1031
Bemærk at roller ikke virker i pl/sql. Du skal istedet grante rettigheder direkte til den bruger der skal kunne execute.
Min oracle db er installeret lokalt og jeg anvender den "default" db,pass : scott - log: tiger, der ligger i db. Så er det relevant med privilegier? Og ang. fejlkode, så er den, ora 01031, som du vist selv har hintet til. Mht. ext., så mente jeg, at jeg havde forsøgt at droppe en prodcedure ved at skrive "sql", efter procedure navnet f.eks "drop procedure prod3.sql;".
Hej, du skriver du bruger 'list' kommandoen. Prøv og tjek select * from dba_objects where object_name='fktnavn' eller fra all_objects om objectet findes. Hvis der ikke kommer noget frem prøv da evt istedet select * from dba_objects where upper(object_name)=upper('fktnavn') eller fra all_objects. Her kan du også se hvem der er ejer af objektet- Log på som ejer eller en bruger med dba retigheder og drop objektet.
Hej lundsgaard! Når jeg skriver: select * from all_objects where upper(object_name)=upper('func1');, får jeg at vide at: "Ingen rækker er valgt"? Ved med sikkerhed, at jeg har en function, der er gemt, som func1. Vil meget gerne have løst det her lille problem....flere point på banen!!!!
"list" giver dig de kommandoer du sidst har fyret af. Hvis du ikke får noget ud der ligner din "func1" når du selecter * from all_objects, så har du ikke en funktion der hedder sådan.
Måske du har brugt gåseøjne (") da du oprettede objectet.
Prøv at spoole output fra din select ud i en fil og søg efter dit func navn i den spool fil du får. Søg f.eks. med notepad.
i sqlplus: spool c:\test.trc select * from all_objects; spool off
åbn c:\test.trc med notepad og søg efter din func.
viewet ALL_OBJECTS viser ikke alle funktioner i databasen, men kun dem du har adgang til. Hvis du vil være sikker skal du kigge i DBA_OBJECTS, men det kræver specielle retigheder. Der er også en anden mulighed, nemlig at din funktion ligger i en pakke. Hvis den ligger i en pakke kalder man den <pakkenavn>.<funktionsnavn>. Du kan også lede efter pakker i ALL_OBJECTS og i DBA_OBJECTS.
Ja, det gør det nemmere med ALL_OBJECTS, men hvis han skal være sikker er han nødt til at bruge DBA_OBJECTS og så gøre som du har beskrevt ved søgning i spool filen
Jeg kiggede lige på list kommandoen og det faldt mig ind om du selv har lagt funktionen ind i oracle med Create function <fkt navn> eller en anden bruger har lagt den ind med Create. Hvis det er en 'indbygget' funktion du prøver at slette skal du have dba priviliger for at det kan lade sig gøre. For at en funktion kan ligge i databasen (permanent)skal den være oprette med create af en bruger eller fra databasen's side
Hej lundsgaard! Jeg har selv oprettet funktionerne på følgende vis: Skrevet dem i notepad, copy - pastede dem over i oracle, gemt dem med: "save [function_name]". Har ikke anvendt "Create function [function_name]", som du foreslår!
Hej, Det betyder at de ikke er i oracle. Du har gemt source udenfor oracle på fil systemet på den maskine databasen er på. Du kan finde den ved at ved at søge efter filnavne i det almidelige filsystem. Den eneste måde du kan få funktionen ind i oracle på er ved at skrive create function fkt_navn ... Hvis du vil have en fuktion ind kan du prøve at paste din function ind igen med create function foran og derefter køre den (med / eller ;)
Okay.....! Jeg er tilsyneladende lettere stupid, for jeg kan ikke få det til at fungere. Har følgende kode stump:
declare zipnr zipcodes.zip%type; ccity zipcodes.city%type; status boolean;
procedure get_zip( zip_no in zipcodes.zip%type, city_name out zipcodes.city%type, status out boolean) is
begin select city into city_name from zipcodes where zipcodes.zip=zip_no; status := true;
exception when no_data_found then status := false;
end;
begin zipnr := 54444; get_zip(zipnr, ccity, status); if (status) then dbms_output.put_line(zipnr ||' '|| ccity); else dbms_output.put_line('Den angivet zipcode ' || zipnr || ' findes ikke ');
end if;
end; /
Hvor og hvordan skal jeg tilføje "create function"....???? Hvis jeg tilføjer det foran "procedure get_zip" og udelader declare delen får jeg følgende advarsel: "Procedure er oprettet med kompileringsfejl". Hvis jeg forsøger at oprettet den med declare delen, får jeg denne fejl:
create procedure get_zip( * FEJL i linie 6: ORA-06550: linje 6, kolonne 1: PLS-00103: Fandt symbolet "CREATE", hvor en af følgende var forventet: begin function package pragma procedure subtype type use <an identifier> <a double-quoted delimited-identifier> form current cursor Symbolet "CREATE" blev ignoreret.
Hvis jeg opretter ovenstående function, uden declare delen kan jeg efterfølgende droppe den med drop function [function_name] og jeg kan se den vha. "select * from all_objects where upper(object_name)=upper('get_zip');"....fint nok! Men jeg får stadigvæk at vide at der komp. fejl? Og jeg kan ikke kalde den med "start get_zip". Er ikke sådan man kan kalde en gemt function?
Det du har lavet er "kun" en PL/SQL blok, du laver ikke nogen procedure
Hvis du vil lave en procedure du kan bruge andre steder brug følgende.
Hvis du vil have det til at køre bedre så lav en cursor i din procedure. ex. i bunden
create or replace procedure get_zip( zip_no in zipcodes.zip%type, city_name out zipcodes.city%type, status out boolean) is
begin select city into city_name from zipcodes where zipcodes.zip=zip_no; status := true;
exception when no_data_found then status := false;
end; /
declare zipnr zipcodes.zip%type; ccity zipcodes.city%type; status boolean; begin zipnr := 54444; get_zip(zipnr, ccity, status); if (status) then dbms_output.put_line(zipnr ||' '|| ccity); else dbms_output.put_line('Den angivet zipcode ' || zipnr || ' findes ikke ');
end if;
end; /
create or replace procedure get_zip( zip_no in zipcodes.zip%type, city_name out zipcodes.city%type, status out boolean) is cursor c1 is select city from zipcodes where where zipcodes.zip=zip_no; tmp_name out zipcodes.city%type, begin tmp_name:=null; for rec in c1 loop tmp_name:=rec.city; end loop; select city if tmp_city is NULL then city_name:=NULL; status :=FALSE; else city_name:=tmp_city; status :=TRUE; end if; end; /
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.