Oprettet ons. d. 17. maj 2006 kl. 13:11:49

conrad
conrad (18.140 point. Point ude: 120)

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 ?

Skrevet ons. d. 17. maj 2006 kl. 13:21:25| #1

senj
senj (30.248 point)
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

Skrevet ons. d. 17. maj 2006 kl. 13:27:59| #2

conrad
conrad (18.140 point)
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

Skrevet ons. d. 17. maj 2006 kl. 13:29:47| #3

senj
senj (30.248 point)
Ok så skriver du bare en AND ind med dit procedure navn, så får du én række

Skrevet ons. d. 17. maj 2006 kl. 13:32:18| #4

senj
senj (30.248 point)
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.

Skrevet ons. d. 17. maj 2006 kl. 13:46:54| #5

conrad
conrad (18.140 point)
hvad med scemaet er det noget jeg skal angive nogle steder her ? Min procedure bliver lavet som Create [mitschema].procedurenavn

Skrevet ons. d. 17. maj 2006 kl. 13:49:54| #6

senj
senj (30.248 point)
så smider du denne ind før order by:

AND OWNER = 'SCHEMA_OWNER'

Skrevet ons. d. 17. maj 2006 kl. 15:16:35| #7

pnielsen
pnielsen (30.303 point)
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;

Skrevet ons. d. 17. maj 2006 kl. 16:04:16| #8

conrad
conrad (18.140 point)
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 ?

Skrevet ons. d. 17. maj 2006 kl. 16:12:58| #9

pnielsen
pnielsen (30.303 point)
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.

Skrevet ons. d. 17. maj 2006 kl. 16:16:31| #10

conrad
conrad (18.140 point)
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

Skrevet ons. d. 17. maj 2006 kl. 16:21:49| #11

pnielsen
pnielsen (30.303 point)
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;
/

Skrevet ons. d. 17. maj 2006 kl. 16:49:55| #12

pnielsen
pnielsen (30.303 point)
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;

Skrevet tor. d. 18. maj 2006 kl. 16:11:44| #13


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Apps DBA-rådgivning, E-business Suite.

Oprettet den 15. januar 2012 kl. 20.20
steber giver 30 point for svar | Giv et svar »

Oracle query

Oprettet den 10. november 2011 kl. 11.51
diyar giver 60 point for svar | Giv et svar »

SQL: Select afd, Count(personer) group by - sammenlagte...

Oprettet den 12. september 2011 kl. 17.45
prebenrunge giver 60 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger