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
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
Ok så skriver du bare en AND ind med dit procedure navn, så får du én række
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.
hvad med scemaet er det noget jeg skal angive nogle steder her ? Min procedure bliver lavet som Create [mitschema].procedurenavn
så smider du denne ind før order by:
AND OWNER = 'SCHEMA_OWNER'
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.
Hvordan kan det være ?
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;
/
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;