Avatar billede conrad Nybegynder
17. maj 2006 - 13:11 Der er 12 kommentarer og
1 løsning

Finde ud af om en stored procedure findes fra sql statement

Hvordan finder jeg ud af om en sproc findes via et statement, altså fra kode ?
Avatar billede senj Nybegynder
17. maj 2006 - 13:21 #1
Hvad gir denne her dig?

SELECT *
FROM (
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS, LAST_DDL_TIME, OBJECT_ID
FROM SYS.USER_OBJECTS
WHERE 1=1
AND OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE')
) O, SYS.ALL_PROBE_OBJECTS D
WHERE  O.OBJECT_ID = D.OBJECT_ID (+)
AND    O.OBJECT_NAME = D.OBJECT_NAME (+)
AND    ((D.OBJECT_TYPE  IS NULL) OR (D.OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE')))
ORDER BY 2, 1
Avatar billede conrad Nybegynder
17. maj 2006 - 13:27 #2
en frygtelig masse records. Jeg skal selvfølgelig kunne finde ud af om min sproc, xxx, findes, så jeg kan droppe den eller i andre tilfælde kalde den
Avatar billede senj Nybegynder
17. maj 2006 - 13:29 #3
Ok så skriver du bare en AND ind med dit procedure navn, så får du én række
Avatar billede senj Nybegynder
17. maj 2006 - 13:32 #4
SELECT *
FROM (
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS, LAST_DDL_TIME, OBJECT_ID
FROM SYS.USER_OBJECTS
WHERE 1=1
AND OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE')
AND OBJECT_NAME = 'PROCEDURENAME'
) O, SYS.ALL_PROBE_OBJECTS D
WHERE  O.OBJECT_ID = D.OBJECT_ID (+)
AND    O.OBJECT_NAME = D.OBJECT_NAME (+)
AND    ((D.OBJECT_TYPE  IS NULL) OR (D.OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE')))
ORDER BY 2, 1

SÅDAN HER, SÅ ÆNDRE DU BARE PROCEDURENAME TIL DIN PROCEDURES NAVN.
Avatar billede conrad Nybegynder
17. maj 2006 - 13:46 #5
hvad med scemaet er det noget jeg skal angive nogle steder her ? Min procedure bliver lavet som Create [mitschema].procedurenavn
Avatar billede senj Nybegynder
17. maj 2006 - 13:49 #6
så smider du denne ind før order by:

AND OWNER = 'SCHEMA_OWNER'
Avatar billede pnielsen Nybegynder
17. maj 2006 - 15:16 #7
Der er ikke owner i USER_OBJECTS! Hvorfor joiner du med ALL_PROBE_OBJECTS her?
Måske der er noget jeg ikke har forstået i spørgsmålet, men jeg ville bare lave denne simple:

select count(*) from dba_objects
where owner='USERNAME'  -- udskift med schemaejer
and object_Name='PROCEDURENAVN' -- udskift med procedurenavn
and object_Type in ('FUNCTION','PACKAGE','PACKAGE BODY','PROCEDURE'); -- tilføj kun denne linie hvis du ønsker at teste på type

Ved ikke om du vil have andre typer med - eller om du overhovedet behøver at checke på typen?

Du kan få en næsten komplet liste over muligheder her
select distinct object_type from dba_objects;
Avatar billede conrad Nybegynder
17. maj 2006 - 16:04 #8
Pnielsen: det virker helt fint, så bare læg et svar - dog hedder min sproc minsproc når jeg opretter den men jeg kan kun finde den hvis jeg selecter object_Name=MINSPROC, altså UPPERCASE.

Hvordan kan det være ?
Avatar billede pnielsen Nybegynder
17. maj 2006 - 16:12 #9
Når du opretter din procedure skriver du "create procedure minproc is" og da oracle ikke er case sensitive vil den sætte navnet til MINPROC. Det er helt normalt. Man kan godt force databasen til at gemme navnet i den case du skriver den i (ved at sætte " omkring navnet - "minproc" - men det er ikke velset i Oracle.

Prøv det her:

select count(*) from dba_objects
where upper(owner)=upper('USERNAME')
and upper(object_Name)=upper('MINPROC')
and object_Type in ('PROCEDURE');

så kan du skrive det i lower/upper case - og Oracle vil altid lave det om til upper.
Avatar billede conrad Nybegynder
17. maj 2006 - 16:16 #10
super, kan det lade sig døre at teste om sprocen findes, og hvis, så droppe den ?

Alstå noget i stil med IF (select 1 from dba_objects
where upper(owner)=upper('USERNAME')
and upper(object_Name)=upper('MINPROC')
and object_Type in ('PROCEDURE') then DROP MINPROC;

behøver jeg sige at jeg ikke kan få det til at virke
Avatar billede pnielsen Nybegynder
17. maj 2006 - 16:21 #11
hmm - nu har jeg ikke lige en sqlplus her - men lad mig prøve:

begin

IF (
select count(*) from dba_objects
where upper(owner)=upper('USERNAME')
and upper(object_Name)=upper('MINPROC')
and object_Type in ('PROCEDURE')
) > 0
  then
    DROP MINPROC;
  else
  create procedure....
end if;
end;
/
Avatar billede pnielsen Nybegynder
17. maj 2006 - 16:49 #12
Så fik jeg adgang....

declare

test number;

begin

select count(*) into test from dba_objects where upper(owner)=upper('BRUGERNAVN')and upper(object_Name)=upper('MINPROC')
and object_Type in ('PROCEDURE') ;

IF test > 0
  then
execute immediate 'DROP PROCEDURE MINPROC';
  else
execute immediate 'CREATE OR REPLACE PROCEDURE minproc IS BEGIN null; END minproc;';
end if;

end;
Avatar billede conrad Nybegynder
18. maj 2006 - 16:11 #13
takker
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

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