update source$ set source = replace(source,'old_name','new_name') where source like '%old_name%'
-- To process a SQL statement, you must have an open cursor nCursorId := DBMS_SQL.OPEN_CURSOR ; -- Every SQL statement must be parsed DBMS_SQL.PARSE (nCursorId , SqlStatement_CLOB, DBMS_SQL.NATIVE); -- DDL statements are run on the parse, which performs the implied commit.
SELECT * FROM TABLE_NAME
, the compiler for some reason expected SELECT * FROM PROD.TABLE_NAME
, although at the beginning of the DDL script it was written CREATE OR REPLACE PROCEDURE PROD.PROCEDURE_NAME
and when in " PL / SQL Developer " or " TOAD " you compile objects of another scheme (not the one under which you log in), everything compiles without errors. GRANT SELECT ANY DICTIONARY TO PROD;
Privilege needed for debugging GRANT DEBUG ANY PROCEDURE TO PROD;
SELECT SC.SOURCE FROM SYS.USER$ UR JOIN SYS.OBJ$ OB ON UR.USER# = OB.OWNER# JOIN SYS.SOURCE$ SC ON SC.OBJ# = OB.OBJ# WHERE UR.USER# = 50 /* schema id from table USER$ for 'PROD'*/ AND UPPER(SC.SOURCE) LIKE '%' || 'GET_ACTUAL_DATE' || '%' ORDER BY SC.OBJ# , SC.LINE ;
'(' || 'GET_ACTUAL_DATE'
, also before calling the function there were other characters: WITH PATTERNS AS ( SELECT 'GET_ACTUAL_DATE' AS ERST /* */ , '(' AS OPENING /* */ , '' AS CLOSING /* */ , 'SYSDATE' AS BECOME /* */ FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ' ' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '=' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ',' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '''' , '' , 'SYSDATE' FROM DUAL ) SELECT PT.OPENING || PT.ERST || PT.CLOSING /* */ , PT.OPENING || PT.BECOME || PT.CLOSING /* */ FROM PATTERNS PT ;
WITH PATTERNS AS ( SELECT 'GET_ACTUAL_DATE' AS ERST , '(' AS OPENING , '' AS CLOSING , 'SYSDATE' AS BECOME FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ' ' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '=' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ',' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '''' , '' , 'SYSDATE' FROM DUAL ) SELECT SC.OBJ# AS OBJ# , SC.LINE AS LINE , SC.SOURCE AS SOURCE , REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) AS COMPLETE FROM SYS.USER$ UR JOIN SYS.OBJ$ OB ON UR.USER# = OB.OWNER# JOIN SYS.SOURCE$ SC ON SC.OBJ# = OB.OBJ# , PATTERNS PT WHERE UR.USER# = 50 /* USER PROD */ AND UPPER(SC.SOURCE) LIKE '%' || PT.ERST || '%' AND REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) <> UPPER(SC.SOURCE) ORDER BY OBJ# , LINE ;
WITH EXCLUDE_LINE AS /* */ ( SELECT 105857 AS OBJ# , 321 AS LINE FROM DUAL UNION SELECT 82036 , 50 FROM DUAL ) , EXCLUDE_OBJ AS /* */ ( SELECT 121939 AS OBJ# FROM DUAL ) , PATTERNS AS ( SELECT 'GET_ACTUAL_DATE' AS ERST , '(' AS OPENING , '' AS CLOSING , 'SYSDATE' AS BECOME FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ' ' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '=' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ',' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '''' , '' , 'SYSDATE' FROM DUAL ) SELECT SC.OBJ# AS OBJ# , SC.LINE AS LINE , SC.SOURCE AS SOURCE , REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) AS COMPLETE FROM SYS.USER$ UR JOIN SYS.OBJ$ OB ON UR.USER# = OB.OWNER# JOIN SYS.SOURCE$ SC ON SC.OBJ# = OB.OBJ# , PATTERNS PT WHERE UR.USER# = 50 AND UPPER(SC.SOURCE) LIKE '%' || PT.ERST || '%' AND (SC.OBJ# , SC.LINE ) NOT IN (SELECT EL.OBJ# , EL.LINE FROM EXCLUDE_LINE EL ) AND SC.OBJ# NOT IN (SELECT EO.OBJ# FROM EXCLUDE_OBJ EO ) AND REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) <> UPPER(SC.SOURCE) ORDER BY OBJ# , LINE ;
CREATE TABLE SWAP_SOURCE_CODE ( BATCH NUMBER, /* / */ OBJ# NUMBER, /* */ LINE NUMBER, /* */ SOURCE VARCHAR2(4000 BYTE), /* SYS.SOURCE$.SOURCE%TYPE */ OUTPUT VARCHAR2(4000 BYTE), /* */ CONSTRAINT PK_SWAP_SOURCE_CODE PRIMARY KEY (BATCH, OBJ#, LINE) USING INDEX TABLESPACE PROD_INDEX STORAGE (INITIAL 80 K NEXT 1 M MAXEXTENTS UNLIMITED) )
INSERT INTO SWAP_SOURCE_CODE WITH EXCLUDE_LINE AS /* */ ( SELECT 105857 AS OBJ# , 321 AS LINE FROM DUAL UNION SELECT 82036 , 50 FROM DUAL ) , EXCLUDE_OBJ AS /* */ ( SELECT 121939 AS OBJ# FROM DUAL ) , BATCH_NUMBER AS /* */ ( SELECT (COALESCE (MAX(BATCH),0) +1) AS BATCH# FROM PROD.SWAP_SOURCE_CODE ) , PATTERNS AS /* */ ( SELECT 'GET_ACTUAL_DATE' AS ERST , '(' AS OPENING , '' AS CLOSING , 'SYSDATE' AS BECOME FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ' ' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '=' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , ',' , '' , 'SYSDATE' FROM DUAL UNION ALL SELECT 'GET_ACTUAL_DATE' , '''' , '' , 'SYSDATE' FROM DUAL ) SELECT BATCH_NUMBER.BATCH# , SC.OBJ# AS OBJ# , SC.LINE AS LINE , SC.SOURCE AS SOURCE , REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) AS COMPLETE FROM SYS.USER$ UR JOIN SYS.OBJ$ OB ON UR.USER# = OB.OWNER# JOIN SYS.SOURCE$ SC ON SC.OBJ# = OB.OBJ# , PATTERNS PT , BATCH_NUMBER WHERE UR.USER# = 50 /* PROD */ AND UPPER(SC.SOURCE) LIKE '%' || PT.ERST || '%' AND (SC.OBJ# , SC.LINE ) NOT IN (SELECT EL.OBJ# , EL.LINE FROM EXCLUDE_LINE EL ) AND SC.OBJ# NOT IN (SELECT EO.OBJ# FROM EXCLUDE_OBJ EO ) AND REPLACE ( UPPER(SC.SOURCE) , PT.OPENING || PT.ERST || PT.CLOSING , PT.OPENING || PT.BECOME || PT.CLOSING ) <> UPPER(SC.SOURCE) ORDER BY OBJ# , LINE ;
SELECT * FROM SWAP_SOURCE_CODE;
CREATE TABLE SOURCE_CODE_BACKUP ( BATCH NUMBER, /* */ OBJ NUMBER, /* */ CODE_BACKUP CLOB, /* */ CODE_UPDATE CLOB, /* */ CONSTRAINT PK_SOURCE_CODE_BACKUP PRIMARY KEY (BATCH, OBJ) USING INDEX TABLESPACE PROD_INDEX STORAGE (INITIAL 80 K NEXT 1 M MAXEXTENTS NLIMITED) )
CREATE OR REPLACE PROCEDURE P_REPLACE_SOURCE_WITH_OUTPUT ( N_BATCH_IN IN NUMBER /* */ ) AS /* */ CURSOR GetObjFromSwap_Source_Code ( nBatchIn IN NUMBER ) IS SELECT SW.OBJ# AS OBJ FROM SWAP_SOURCE_CODE SW WHERE SW.BATCH = nBatchIn GROUP BY SW.OBJ# ORDER BY SW.OBJ# ; TYPE T_OBJ_TABLE IS TABLE OF GetObjFromSwap_Source_Code%ROWTYPE; OBJ_TABLE T_OBJ_TABLE := T_OBJ_TABLE(); nObjCount NUMBER ; nObjFirstIndex NUMBER ; nObjLastIndex NUMBER ; nObj NUMBER; ObjBackup_CLOB CLOB ; /* */ ObjUpdate_CLOB CLOB ; /* */ nBATCH NUMBER; /* */ CURSOR GetNextBatchNumber IS SELECT COALESCE( MAX(SB.BATCH),0 ) + 1 FROM SOURCE_CODE_BACKUP SB ; nIsEqual NUMBER ; /* */ /* */ PROCEDURE PARSE_SOURCE_CODE_WITH_OUTPUT ( nObjIn IN NUMBER /* */ , nBatchIn IN NUMBER /* */ , ObjBackupOut_CLOB OUT CLOB /* */ , ObjUpdateOut_CLOB OUT CLOB /* */ ) AS /* */ CURSOR GetObjNameTypeSchema ( nObjIn IN NUMBER ) IS /* SYS.DBA_OBJECTS , DBMS_METADATA.GET_DDL , DBA_OBJECTS "_" , http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_metada.htm#BGBBIEGA */ WITH OBJ_TYPE AS ( SELECT 0 AS TYPE#, 'NEXT_OBJECT' AS NAME FROM DUAL UNION ALL SELECT 1, 'INDEX' FROM DUAL UNION ALL SELECT 2, 'TABLE' FROM DUAL UNION ALL SELECT 3, 'CLUSTER' FROM DUAL UNION ALL SELECT 4, 'VIEW' FROM DUAL UNION ALL SELECT 5, 'SYNONYM' FROM DUAL UNION ALL SELECT 6, 'SEQUENCE' FROM DUAL UNION ALL SELECT 7, 'PROCEDURE' FROM DUAL UNION ALL SELECT 8, 'FUNCTION' FROM DUAL UNION ALL /* 'PACKAGE' , 'PACKAGE_SPEC' */ SELECT 9, 'PACKAGE_SPEC' FROM DUAL UNION ALL -- 'PACKAGE' SELECT 11, 'PACKAGE_BODY' FROM DUAL UNION ALL SELECT 12, 'TRIGGER' FROM DUAL UNION ALL /* 'TYPE' , 'TYPE_SPEC' */ SELECT 13, 'TYPE_SPEC' FROM DUAL UNION ALL --TYPE SELECT 14, 'TYPE_BODY' FROM DUAL UNION ALL SELECT 19, 'TABLE_PARTITION' FROM DUAL UNION ALL SELECT 20, 'INDEX_PARTITION' FROM DUAL UNION ALL SELECT 21, 'LOB' FROM DUAL UNION ALL SELECT 22, 'LIBRARY' FROM DUAL UNION ALL SELECT 23, 'DIRECTORY' FROM DUAL UNION ALL SELECT 24, 'QUEUE' FROM DUAL UNION ALL SELECT 28, 'JAVA_SOURCE' FROM DUAL UNION ALL SELECT 29, 'JAVA_CLASS' FROM DUAL UNION ALL SELECT 30, 'JAVA_RESOURCE' FROM DUAL UNION ALL SELECT 32, 'INDEXTYPE' FROM DUAL UNION ALL SELECT 33, 'OPERATOR' FROM DUAL UNION ALL SELECT 34, 'TABLE_SUBPARTITION' FROM DUAL UNION ALL SELECT 35, 'INDEX_SUBPARTITION' FROM DUAL UNION ALL SELECT 39, 'LOB_PARTITION' FROM DUAL UNION ALL SELECT 40, 'LOB_SUBPARTITION' FROM DUAL UNION ALL SELECT 43, 'DIMENSION' FROM DUAL UNION ALL SELECT 44, 'CONTEXT' FROM DUAL UNION ALL SELECT 47, 'RESOURCE_PLAN' FROM DUAL UNION ALL SELECT 48, 'CONSUMER_GROUP' FROM DUAL UNION ALL SELECT 51, 'SUBSCRIPTION' FROM DUAL UNION ALL SELECT 52, 'LOCATION' FROM DUAL UNION ALL SELECT 56, 'JAVA_DATA' FROM DUAL ) SELECT OB.NAME , TP.NAME , UR.NAME FROM SWAP_SOURCE_CODE SW JOIN SYS.OBJ$ OB ON SW.OBJ# = OB.OBJ# JOIN SYS.USER$ UR ON UR.USER# = OB.OWNER# LEFT JOIN OBJ_TYPE TP ON OB.TYPE# = TP.TYPE# WHERE SW.OBJ# = nObjIn ; ObjRaw_CLOB CLOB; /* */ ObjParsed_CLOB CLOB; /* DDL */ sObjName VARCHAR2(30); /* */ sTypeName VARCHAR2(30); /* */ sSchemaName VARCHAR2(30); /* */ /* */ CURSOR GetSourceOutputFromSwap_Source ( nObjectNumberIn IN NUMBER , nBatchNumberIn IN NUMBER ) IS SELECT SW.SOURCE AS SOURCE , SW.OUTPUT AS OUTPUT FROM SWAP_SOURCE_CODE SW WHERE SW.BATCH = nBatchNumberIn AND SW.OBJ# = nObjectNumberIn ORDER BY SW.LINE ; TYPE T_SOURCE_AND_OUTPUT_TABLE IS TABLE OF GetSourceOutputFromSwap_Source%ROWTYPE; SourceAndOutput_TABLE T_SOURCE_AND_OUTPUT_TABLE := T_SOURCE_AND_OUTPUT_TABLE(); nSourceCount NUMBER ; nSourceFirstIndex NUMBER ; nSourceLastIndex NUMBER ; sPlaceholder SYS.SOURCE$.SOURCE%TYPE; /* */ sSubstitute SYS.SOURCE$.SOURCE%TYPE; /* */ BEGIN /* GET_DDL , */ OPEN GetObjNameTypeSchema(nObjIn); FETCH GetObjNameTypeSchema INTO sObjName, sTypeName, sSchemaName; CLOSE GetObjNameTypeSchema; /* */ ObjRaw_CLOB := DBMS_METADATA.GET_DDL ( OBJECT_TYPE => sTypeName , NAME => sObjName , SCHEMA => sSchemaName ); /* */ ObjBackupOut_CLOB := ObjRaw_CLOB ; /* */ ObjParsed_CLOB := ObjRaw_CLOB; OPEN GetSourceOutputFromSwap_Source ( nObjectNumberIn => nObjIn , nBatchNumberIn => nBatchIn ); FETCH GetSourceOutputFromSwap_Source BULK COLLECT INTO SourceAndOutput_TABLE; CLOSE GetSourceOutputFromSwap_Source ; nSourceCount := SourceAndOutput_TABLE.COUNT; IF ( nSourceCount > 0 ) THEN nSourceFirstIndex := SourceAndOutput_TABLE.FIRST; nSourceLastIndex := SourceAndOutput_TABLE.LAST; FOR indx IN nSourceFirstIndex .. nSourceLastIndex LOOP sPlaceholder := SourceAndOutput_TABLE(indx).SOURCE ; sSubstitute := SourceAndOutput_TABLE(indx).OUTPUT ; /* */ ObjParsed_CLOB := REPLACE ( ObjParsed_CLOB , sPlaceholder , sSubstitute ); END LOOP; /* */ ObjUpdateOut_CLOB := ObjParsed_CLOB ; END IF ; END PARSE_SOURCE_CODE_WITH_OUTPUT ; BEGIN /* */ OPEN GetNextBatchNumber; FETCH GetNextBatchNumber INTO nBATCH; CLOSE GetNextBatchNumber; /* */ OPEN GetObjFromSwap_Source_Code(N_BATCH_IN); FETCH GetObjFromSwap_Source_Code BULK COLLECT INTO OBJ_TABLE; CLOSE GetObjFromSwap_Source_Code; nObjCount := OBJ_TABLE.COUNT; IF ( nObjCount > 0 ) THEN nObjFirstIndex := OBJ_TABLE.FIRST; nObjLastIndex := OBJ_TABLE.LAST; FOR indx IN nObjFirstIndex .. nObjLastIndex LOOP /* */ nObj := OBJ_TABLE(indx).OBJ; /* */ PARSE_SOURCE_CODE_WITH_OUTPUT ( nObjIn => nObj , nBatchIn => N_BATCH_IN , ObjBackupOut_CLOB => ObjBackup_CLOB , ObjUpdateOut_CLOB => ObjUpdate_CLOB ); /* */ nIsEqual := DBMS_LOB.COMPARE(ObjBackup_CLOB,ObjUpdate_CLOB); IF( nIsEqual IS NOT NULL /* NULL CLOB_ */ AND nIsEqual <> 0 /* CLOB _ 0, 0 */ ) THEN /* CLOB _ SOURCE_CODE_BACKUP */ INSERT INTO SOURCE_CODE_BACKUP (BATCH,OBJ,CODE_BACKUP,CODE_UPDATE) VALUES(nBATCH,nObj,ObjBackup_CLOB,ObjUpdate_CLOB) ; END IF ; END LOOP; END IF ; END P_REPLACE_SOURCE_WITH_OUTPUT ;
BEGIN P_REPLACE_SOURCE_WITH_OUTPUT( N_BATCH_IN => 1 ); END;
SELECT * FROM SOURCE_CODE_BACKUP;
CREATE OR REPLACE PROCEDURE P_EXECUTE_CODE_UPDATE ( N_BATCH_IN NUMBER /* */ ) AS /* , */ CURSOR GetUpdateFromSourceCodeBackup ( nBatchNumberIn IN NUMBER ) IS SELECT SB.CODE_UPDATE AS CodeUpdate , SB.OBJ AS Obj FROM SOURCE_CODE_BACKUP SB JOIN SYS.OBJ$ OB ON SB.OBJ = OB.OBJ# WHERE SB.BATCH = nBatchNumberIn AND OB.TYPE# <> 12 -- 12, 'TRIGGER' /* DBMS_METADATA.GET_DDL , DDL , , DBMS_METADATA */ ORDER BY SB.BATCH , SB.OBJ ; TYPE T_CodeUpdate IS TABLE OF GetUpdateFromSourceCodeBackup%ROWTYPE; CodeUpdate_TABLE T_CodeUpdate := T_CodeUpdate(); nCodeUpdateCount NUMBER; nCodeUpdateFirst NUMBER; nCodeUpdateLast NUMBER; /* */ SqlText_CLOB CLOB; nObj NUMBER; /* */ CURSOR GetObjName( ObjIn IN NUMBER ) IS SELECT OB.NAME AS ObjectName FROM SYS.OBJ$ OB WHERE OB.OBJ# = ObjIn ; /* ORACLE 30- , - 32767 */ sObjectName VARCHAR2(32767); BEGIN /* " " , */ DBMS_OUTPUT.ENABLE(NULL); /* DDL */ OPEN GetUpdateFromSourceCodeBackup(N_BATCH_IN); FETCH GetUpdateFromSourceCodeBackup BULK COLLECT INTO CodeUpdate_TABLE; CLOSE GetUpdateFromSourceCodeBackup; nCodeUpdateCount := CodeUpdate_TABLE.COUNT; IF ( nCodeUpdateCount > 0 ) THEN nCodeUpdateFirst := CodeUpdate_TABLE.FIRST; nCodeUpdateLast := CodeUpdate_TABLE.LAST; FOR indx IN nCodeUpdateFirst .. nCodeUpdateLast LOOP /* DDL */ SqlText_CLOB := CodeUpdate_TABLE(indx).CodeUpdate; /* */ nObj := CodeUpdate_TABLE(indx).Obj; /* */ OPEN GetObjName(nObj); FETCH GetObjName INTO sObjectName ; CLOSE GetObjName; /* */ DBMS_OUTPUT.PUT_LINE( '#' || LPAD (indx, 3,'0' )|| ' Process .. ' || sObjectName || ' ' || nObj ); /* DDL */ EXECUTE IMMEDIATE SqlText_CLOB; /* , */ DBMS_OUTPUT.PUT_LINE( '#' || LPAD (indx, 3,'0' )|| ' Complete ' || sObjectName || ' ' || nObj ); END LOOP; END IF; END;
BEGIN PARUS.P_EXECUTE_CODE_UPDATE( N_BATCH_IN => 1 ); END;
SELECT * FROM SWAP_SOURCE_CODE SW JOIN SYS.OBJ$ OB ON OB.OBJ# = SW.OBJ# WHERE OB.TYPE# = 12 AND SW.BATCH = 1 ;
Source: https://habr.com/ru/post/280648/
All Articles