Avatar billede mythsolar Nybegynder
15. juli 2003 - 20:16 Der 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".
Avatar billede mythsolar Nybegynder
15. juli 2003 - 20:48 #1
Hæver med nogle flere point.....
Avatar billede pnielsen Nybegynder
15. juli 2003 - 21:54 #2
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.
Avatar billede mythsolar Nybegynder
16. juli 2003 - 07:45 #3
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;".
Avatar billede nosjns Nybegynder
16. juli 2003 - 08:09 #4
Du skal ikke skrive extenstionen med. Du skal blot skrive navnet på proceduren f.eks. drop procedure min_procedure ;
Avatar billede lundsgaard Nybegynder
16. juli 2003 - 08:21 #5
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.
Avatar billede mythsolar Nybegynder
16. juli 2003 - 20:22 #6
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!!!!
Avatar billede pnielsen Nybegynder
17. juli 2003 - 00:01 #7
så vidt jeg ved er "list" kun det der er i bufferen.

Må jeg se det output du får ?
Avatar billede pnielsen Nybegynder
17. juli 2003 - 00:07 #8
"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.

Er der noget der ligner - så sæt det ind her !!
Avatar billede lundsgaard Nybegynder
17. juli 2003 - 08:10 #9
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.
Avatar billede pnielsen Nybegynder
17. juli 2003 - 08:41 #10
Det var for at slippe for alt for mange objecter når han skulle kigge det igennem. Han siger selv at han kun har brugt scott/tiger.
Avatar billede lundsgaard Nybegynder
17. juli 2003 - 08:48 #11
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
Avatar billede mythsolar Nybegynder
17. juli 2003 - 09:07 #12
Har set jeres svar. Prøver dem af senere idag!
Avatar billede lundsgaard Nybegynder
17. juli 2003 - 09:51 #13
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
Avatar billede mythsolar Nybegynder
17. juli 2003 - 13:34 #14
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!
Avatar billede lundsgaard Nybegynder
17. juli 2003 - 13:48 #15
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 ;)
Avatar billede mythsolar Nybegynder
17. juli 2003 - 18:08 #16
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.

Kaster mere guld ud.....
Avatar billede mythsolar Nybegynder
17. juli 2003 - 18:20 #17
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?
Avatar billede coily Nybegynder
18. juli 2003 - 12:22 #18
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;
/
Avatar billede mythsolar Nybegynder
18. juli 2003 - 15:06 #19
Har set dit svar coily. Prøver det af senere!
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