programing

Oracle - 없는 경우에만 인덱스 만들기

padding 2023. 10. 30. 20:48
반응형

Oracle - 없는 경우에만 인덱스 만들기

인덱스가 없는 경우에만 오라클에서 인덱스를 만들 수 있는 방법이 있습니까?

뭐 이런 거.

CREATE INDEX IF NOT EXISTS ord_customer_ix
   ON orders (customer_id);

없는 경우에만 인덱스 추가:

declare 
  already_exists  exception; 
  columns_indexed exception;
  pragma exception_init( already_exists, -955 ); 
  pragma exception_init(columns_indexed, -1408);
begin 
  execute immediate 'create index ord_customer_ix on orders (customer_id)'; 
  dbms_output.put_line( 'created' ); 
exception 
  when already_exists or columns_indexed then 
  dbms_output.put_line( 'skipped' );  
end;     

없으면 ORACLE에서 인덱스를 만듭니다.

ALTER SESSION SET CURRENT_SCHEMA = PROD_INTG;
DECLARE
  INDEX_EXISTS NUMBER;
BEGIN
  SELECT COUNT(1)
  INTO INDEX_EXISTS
  FROM ALL_INDEXES AI,
    ALL_IND_COLUMNS AIC
  WHERE AI.TABLE_OWNER = 'PROD_INTG'
        AND AI.TABLE_NAME = 'PROCESS_APPLICATION'
        AND AI.INDEX_NAME = AIC.INDEX_NAME
        AND AI.OWNER = AIC.INDEX_OWNER
        AND AIC.COLUMN_NAME IN ('PST_CODE', 'PIZ_TYPE_ID');
  IF (INDEX_EXISTS) > 0
  THEN
    DBMS_OUTPUT.PUT_LINE('INDEX EXISTS  :');
  ELSE
    EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = PROD_INTG';
    EXECUTE IMMEDIATE 'CREATE INDEX PROD_INTG.IDX_IQC_APPS_IN_PROC_PST_PIZ
      ON PROD_INTG.PROCESS_APPLICATION (PST_CODE, PIZ_TYPE_ID) PARALLEL 16';
    EXECUTE IMMEDIATE 'ALTER INDEX PROD_INTG.IDX_IQC_APPS_IN_PROC_PST_PIZ NOPARALLEL';
    DBMS_OUTPUT.PUT_LINE('INDEX created  :');
  END IF;
  EXCEPTION
  WHEN OTHERS THEN
  IF SQLCODE IN (-2275, -955, -02431, -01430, -01451, -01408)
  THEN
    NULL;
  ELSE
    RAISE;
  END IF;
END;
/

스크립트를 사용하여 인덱스가 있는 경우 인덱스를 삭제한 후 생성할 수 있습니다.있는 경우 드롭을 확인하는 오류가 발생합니다.

BEGIN
   EXECUTE IMMEDIATE 'DROP INDEX ord_customer_ix';
EXCEPTION
   WHEN OTHERS
   THEN
      IF SQLCODE != -955
      THEN                           -- ORA-00955 index does not exist
         RAISE;
      END IF;
END;
/

CREATE INDEX ord_customer_ix
  ON orders (customer_id);
;

이것은 꽤 간단하며 코드화하고 이해하기 쉽습니다.

언급URL : https://stackoverflow.com/questions/44539663/oracle-create-an-index-only-if-not-exists

반응형