반응형
Oracle 드롭 인덱스(존재하는 경우)
인덱스가 존재하는 경우에만 인덱스를 드롭하려면 어떻게 해야 합니까?
간단해 보이지만 인터넷에서 찾은 게 있어요.존재하지 않는 경우 오류가 발생하여 프로세스가 중지되기 때문에 폐기하는 것이 좋습니다.
인덱스가 존재하는지 확인하기 위해 다음을 찾았습니다.
select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'
근데 어떻게 조합해야 할지 모르겠어요
DROP INDEX myIndexName
존재 확인은 하지 마세요.드롭을 시도하고 필요에 따라 예외를 캡처합니다.
DECLARE
index_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT (index_not_exists, -1418);
BEGIN
EXECUTE IMMEDIATE 'drop index foo';
EXCEPTION
WHEN index_not_exists
THEN
NULL;
END;
/
DECLARE
COUNT_INDEXES INTEGER;
BEGIN
SELECT COUNT ( * )
INTO COUNT_INDEXES
FROM USER_INDEXES
WHERE INDEX_NAME = 'myIndexName';
-- Edited by UltraCommit, October 1st, 2019
-- Accepted answer has a race condition.
-- The index could have been dropped between the line that checks the count
-- and the execute immediate
IF COUNT_INDEXES > 0
THEN
EXECUTE IMMEDIATE 'DROP INDEX myIndexName';
END IF;
END;
/
Oracle에서는 DDL과 DML을 혼재시킬 수 없습니다.이를 위해서는 EXECUTE Immediate 문을 사용하여 대처해야 합니다.
그래서 먼저 지수의 존재 여부를 확인합니다.
다음으로 EXECUTE Immediate 문을 통해 인덱스를 드롭합니다.
DECLARE v_Exists NUMBER;
BEGIN
v_Exists := 0;
SELECT 1 INTO v_Exists
FROM USER_INDEXES
WHERE TABLE_NAME LIKE 'myTable'
AND INDEX_NAME LIKE 'myIndexName'
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP INDEX myIndexName"
ENDIF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
이 코드가 내 머릿속에서 맴돌고 있어서 네가 좀 고쳐야 할 것 같아. 하지만 이걸 보면 생각이 나.
이게 도움이 됐으면 좋겠네요!=)
여러 번 호출할 수 있도록 절차를 만들었습니다.
DELIMITER €€
DROP PROCEDURE IF EXISTS ClearIndex€€
CREATE PROCEDURE ClearIndex(IN var_index VARCHAR(255),IN var_table VARCHAR(255))
BEGIN
SET @temp = concat('DROP INDEX ', var_index, ' ON ', var_table);
PREPARE stm1 FROM @temp;
BEGIN
DECLARE CONTINUE HANDLER FOR 1091 SELECT concat('Index ', var_index,' did not exist in ',var_table,', but was handled') AS 'INFO';
EXECUTE stm1;
END;
END €€
DELIMITER ;
이제 여러 번 호출할 수 있습니다.
CALL ClearIndex('employees_no_index','employees');
CALL ClearIndex('salaries_no_index','salaries');
CALL ClearIndex('titles_no_index','titles');
이게 도움이 됐으면 좋겠어요.모든 솔루션의 조합입니다:) 그런데, 도움에 감사드립니다!
CREATE OR REPLACE PROCEDURE CLEAR_INDEX(INDEX_NAME IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'drop index ' || INDEX_NAME;
EXCEPTION
WHEN OTHERS THEN
NULL;
END CLEAR_INDEX;
언급URL : https://stackoverflow.com/questions/2722630/oracle-drop-index-if-exists
반응형
'programing' 카테고리의 다른 글
'유형 오류 [ERR_]Invalid_ARG_TYPE]:"path" 인수는 문자열 형식이어야 합니다.수신된 유형이 정의되지 않았습니다.' (0) | 2023.03.12 |
---|---|
Yarn은 사용 가능한 모든 스크립트를 나열할 수 있습니까? (0) | 2023.03.12 |
MongoParseError: useCreateIndex, useFindAndModify 옵션은 지원되지 않습니다. (0) | 2023.03.12 |
하나의 파일에서 여러 JSON 개체를 추출하려면 어떻게 해야 합니까? (0) | 2023.03.12 |
JSON 시리얼화 불가 (0) | 2023.03.12 |