I want to check if a workspace is not available in all_workspace
table then create new workspace.
My requirement is if p_workspace
is not matching the list of value of v_workspace
then it should create new one.
DECLARE p_workspace VARCHAR2(100):='WS-38515'; TYPE t_ws IS TABLE OF VARCHAR2(30); v_workspace t_ws := t_ws(); Begin execute immediate ' SELECT DISTINCT WORKSPACE FROM WMSYS.all_workspaces ' BULK COLLECT INTO v_workspace; FOR i IN v_workspace.first..v_workspace.last LOOP IF v_workspace(i) <> p_workspace THEN dbms_wm.CreateWorkspace(p_workspace,isrefreshed=>TRUE); END IF; END LOOP; EXCEPTION when others then Dbms_Output.put_line(p_workspace || ': ' || SQLERRM); END; /
It gives me error after creation.
PL/SQL procedure successfully completed. WS-38515: ORA-20023: a workspace already exists with the name: 'WS-38515'
If I run that workspace individually then its working. but when I am passing through block with checking availability then its not working.
execute dbms_wm.CreateWorkspace('WS-38515',isrefreshed=>TRUE);
Please help anyone.
Advertisement
Answer
Is there a reason that you need dynamic SQL, a collection, and a loop to iterate over the collection? It sounds like you just want to check whether the row exists which can be done with a simple count
(you could make the check more efficient by writing it as a where exists
but that’s probably not important here)
declare p_workspace VARCHAR2(100):='WS-38515'; l_num_workspaces integer; begin select count(*) into l_num_workspaces from WMSYS.all_workspaces where workspace = p_workspace; if( l_num_workspaces = 0 ) then dbms_wm.CreateWorkspace(p_workspace,isrefreshed=>TRUE); end if; end;
Of course, you could also just skip the check, call CreateWorkspace
, and handle the exception when it already exists. If you expect that the vast majority of the time you’re going to create the workspace, that might be more efficient.