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
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.
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;
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.
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.
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
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; /
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;
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.