Oracle - 커서를 기반으로 테이블 삭제를 위한 동적 함수 생성 (Oracle- creating dynamic function for deleting tables based on cursor)


문제 설명

Oracle ‑ 커서를 기반으로 테이블 삭제를 위한 동적 함수 생성 (Oracle‑ creating dynamic function for deleting tables based on cursor)

삭제하고 다시 생성해야 하는 모든 테이블에 대해 커서를 사용하여 Oracle에서 동적 함수를 빌드하려고 합니다. 예를 들어, 다음 예제 테이블 구조가 있습니다.

CREATE TABLE All_tmp_DATA AS
(SELECT 'T_tmp_test1' As Table_NM, 'TEST1' As Process_name FROM DUAL UNION ALL
 SELECT 'T_tmp_test2' As Table_NM, 'TEST1' As Process_name FROM DUAL UNION ALL
 SELECT 'T_tmp_test3' As Table_NM, 'TEST1' As Process_name FROM DUAL)

위의 "T_tmp"로 시작하는 테이블은 TEST1 프로세스를 시작할 때 카운트가 >1인 경우 삭제해야 하는 데이터베이스의 모든 테이블을 나타냅니다. . "TEST1"을 입력할 수 있는 Process_name 매개변수를 전달하고 All_tmp_DATA에서 Table_NM에 바인딩하고 다음 코드에서 table_name에 삽입하여 커서를 사용하여 루프를 빌드하는 함수가 정말 필요합니다.

BEGIN  
  SELECT count(*)
    INTO l_cnt
    FROM user_tables
    WHERE table_name = 'MY_TABLE';
  IF l_cnt = 1 THEN
    EXECUTE IMMEDIATE 'DROP TABLE my_table';
  END IF;
END;

참조 솔루션

방법 1:

In the beginning, I'd suggest you not to use mixed case when naming Oracle objects.


Test case:

SQL> select * From all_tmp_data;

TABLE_NM    PROCE
‑‑‑‑‑‑‑‑‑‑‑ ‑‑‑‑‑
T_tmp_test1 TEST1
T_tmp_test2 TEST1
T_tmp_test3 TEST1

SQL> create table "T_tmp_test1" as select * From dept;

Table created.

SQL> ‑‑ I don't have "T_tmp_test2"
SQL> create table "T_tmp_test3" as select * From emp;

Table created.

SQL>
SQL> select table_name From user_Tables where upper(table_name) like 'T_TMP%';

TABLE_NAME
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
T_tmp_test3
T_tmp_test1

Procedure which drops tables contained in ALL_TMP_DATA:

  • as opposed to your code, I concatenated table name with DROP
  • as you use table names with mixed case, you have to enclose their names into double quotes, always (did I say not do use that?)

As the final select shows, those tables don't exist any more.

SQL> declare
  2    l_cnt number;
  3  begin
  4    for cur_r in (select table_nm from all_tmp_data) loop
  5      select count(*) into l_cnt
  6      from user_tables
  7      where table_name = cur_r.table_nm;
  8
  9      if l_cnt > 0 then
 10         execute immediate ('drop table "' || cur_r.table_nm || '"');
 11      end if;
 12    end loop;
 13  end;
 14  /

PL/SQL procedure successfully completed.

SQL> select table_name From user_Tables where upper(table_name) like 'T_TMP%';

no rows selected

SQL>

As of the process column: I have no idea what is it used for so I did exactly that ‑ didn't use it.

방법 2:

You can use the exception handling to handle such scenario directly as follows:

DECLARE
    TABLE_DOES_NOT_EXIST EXCEPTION;
    PRAGMA EXCEPTION_INIT ( TABLE_DOES_NOT_EXIST, ‑00942 );
BEGIN
    FOR CUR_R IN (
        SELECT TABLE_NM
          FROM ALL_TMP_DATA
    ) LOOP
        BEGIN
            EXECUTE IMMEDIATE 'drop table "' || cur_r.table_nm || '"';
            DBMS_OUTPUT.PUT_LINE('"' || cur_r.table_nm || '" table dropped.');
        EXCEPTION
            WHEN TABLE_DOES_NOT_EXIST THEN
                DBMS_OUTPUT.PUT_LINE('"' || cur_r.table_nm || '" table does not exists');
        END;
    END LOOP;
END;
/

(by Yen ChingLittlefootPopeye)

참조 문서

  1. Oracle‑ creating dynamic function for deleting tables based on cursor (CC BY‑SA 2.5/3.0/4.0)

#DDL #oracle #DML #SQL






관련 질문

비밀번호로 식별되지 않는 mysql 부여 권한 (mysql grant privileges without identified by password)

PL/SQL 블록의 문자열 변수에서 사용자 생성 (Create user from string variables in a PL/SQL block)

dbms_metadata.get_ddl을 더 예쁘고 유용하게 만드는 방법 (How to make dbms_metadata.get_ddl more pretty/useful)

Postgres에서 테이블의 모든 인덱스를 삭제하려면 어떻게 해야 합니까? (How can I drop all indexes of a table in Postgres?)

DB2의 카탈로그에서 "처음에 기록되지 않은" 테이블을 식별하는 방법 (How to identify tables with "not logged initially" from catalog in DB2)

blob 및 clob 데이터 유형이 있는 oracle11g에 테이블을 생성한 다음 다음 쿼리를 실행했습니다. (I have create table in oracle11g which has blob and clob data type and then I have run following query)

PL/pgsql DDL을 작성하여 redshift에서 스키마를 생성한 다음 ddls를 반복하여 각 스키마에 테이블을 생성하는 방법은 무엇입니까? (How to write PL/pgsql DDL to create schemas in redshift and then looping the ddls to create tables in the respective schemas?)

즉시 실행으로 디렉토리 객체를 생성하려고 할 때 ORA-00900 Invalid SQL 문을 받는 이유는 무엇입니까? (Why am I getting ORA-00900 Invalid SQL statement when trying to create a directory object with execute immediate?)

SQLAlchemy: 부분적으로 지정된 관계 (SQLAlchemy: partially specified relationship)

T-SQL의 한 스크립트에서 동일한 열 정의로 두 개의 테이블을 만드는 방법은 무엇입니까? (How to create two tables with same column definition in one script in T-SQL?)

지리 데이터 유형에서 네이티브 함수 반환 (Native Function Return from Geography Data Type)

Oracle - 커서를 기반으로 테이블 삭제를 위한 동적 함수 생성 (Oracle- creating dynamic function for deleting tables based on cursor)







코멘트