< 이전 | 다음 >

학습 6: 임의의 SQL 코드 실행

이 학습에서는 EGL에서 보다 유연하게 SQL 코드를 사용하는 방법에 대해 설명합니다.

지금까지는 EGL 문과 일치하는 SQL 문을 사용하도록 제한되었습니다. 예를 들어, get 문과 연관된 SQL 코드를 편집할 수 있지만 SQL 코드는 SELECT 문으로만 제한되어 있습니다. 다시 말해, get 문의 명시적 SQL 코드에 SQL DELETE 문을 넣을 수 없습니다. 명시적 SQL을 편집할 수는 있지만 SQL 코드는 여전히 EGL 키워드와 일치해야 합니다.

그렇다면 직접적인 EGL 유사문이 없는 SQL 문을 어떻게 사용할 수 있을까요? 사용자는 Workbench 도구를 통해 직접적으로 또는 EQL execute 문을 통해 EGL 키워드와 연관되지 않은 SQL 문을 실행할 수 있습니다.

SQL 빌더를 사용하여 SQL 문 작성

Workbench에는 EGL 응용프로그램 외부의 데이터베이스와 작업하는 데 사용할 수 있는 여러 도구가 포함되어 있습니다. 이 절에서는 SQL 빌더를 사용하여 보다 직접적으로 샘플 데이터베이스에 대해 작업합니다.

  1. 다음과 같이 데이터 Perspective로 전환하십시오.
    1. > Perspective 열기 > 기타를 클릭하십시오.
    2. Perspective 열기 창에서 데이터를 클릭하십시오.
    3. 확인을 클릭하십시오.
    데이터베이스 작업에 사용되는 보기가 포함되어 있는 데이터 Perspective가 열립니다. 주로 데이터베이스 탐색기 보기를 사용하여 작업을 수행할 것입니다.
  2. 데이터베이스 탐색기 보기에서 연결을 펼치십시오. 데이터베이스 탐색기 보기는 테스트에 사용하는 샘플 Derby 연결과 데이터베이스에 대한 프로젝트의 연결을 EGLDerbyR7로 표시합니다.
    EGLDerbyR7 연결을 표시하는 데이터베이스 탐색기 보기
  3. EGLDerbyR7 연결을 마우스 오른쪽 단추로 클릭한 다음 다시 연결을 클릭하십시오. 이제 데이터베이스 탐색기 보기가 데이터베이스에 연결되므로 데이터 Perspective의 도구를 사용하여 데이터베이스에 대한 작업을 수행할 수 있습니다. 그러나, Derby는 데이터베이스에 대한 연결을 한 번에 하나씩만 허용하므로 데이터베이스 탐색기 보기가 연결된 경우 EGL 프로그램은 데이터베이스에 연결할 수 없습니다.
  4. 데이터베이스 권한 부여 창에서 확인을 클릭하십시오.
  5. EGLDerbyR7 > EGLDerbyR7 > 스키마 > EGL > 테이블을 펼치십시오. 이제, 데이터베이스 탐색기 보기가 이 학습서에서 다루는 데이터베이스의 테이블을 나열합니다. 다른 테이블은 메타데이터이며 이 학습서에는 중요하지 않습니다.
    데이터베이스의 테이블을 표시하는
데이터베이스 탐색기 보기
  6. CUSTOMERS 테이블을 마우스 오른쪽 단추로 클릭한 다음 데이터 > 샘플 컨텐츠를 클릭하십시오. 데이터 출력 보기는 CUSTOMERS 테이블의 데이터를 표시합니다.
    CUSTOMER 테이블을 표시하는 데이터 출력 보기
    데이터 출력 보기는 EGL get 문 뒤의 내재적 SELECT 문과 같이 기본 SELECT 문을 실행합니다. 보다 직접적으로 데이터베이스에 대한 작업을 수행하고 SQL 코드를 EGL 프로그램에 추가하기 전에 테스트하려면, SQL 빌더를 사용하여 대화식으로 SQL 명령을 작성하고 실행할 수 있습니다.
  7. 데이터베이스 탐색기 보기에서 파란색 데이터베이스 아이콘이 표시하는 EGLDerbyR7 데이터베이스를 마우스 오른쪽 단추로 클릭한 다음 새 SQL 문을 클릭하십시오.
    새 SQL 문 메뉴 옵션을 표시하는 데이터베이스 탐색기 보기
  8. 새 SQL 문 창에서 명령문의 이름을 sqlStatements로 지정하십시오.
  9. 명령문 템플리트 필드는 SELECT로 설정하고 편집 도구 단일 선택 단추 그룹은 SQL 빌더로 설정된 상태로 두십시오.
    새 SQL 문 창
  10. 확인을 클릭하십시오. SQL 빌더가 열립니다. 이 편집기에서 SQL 문을 작성한 다음 응용프로그램에 추가하기 전에 테스트할 수 있습니다.
  11. 예를 들어, 고객 레코드의 기본 SQL 문을 SQL 빌더에 붙여넣으십시오. EGL 편집기의 명시적 SQL에서 이 명령문(또는 기타 임의의 SQL 문)을 복사하거나 다음 코드를 사용할 수 있습니다.
    select
      EGL.CUSTOMER.CUSTOMER_ID, EGL.CUSTOMER.FIRST_NAME, 
      EGL.CUSTOMER.LAST_NAME, EGL.CUSTOMER.PASSWORD, 
      EGL.CUSTOMER.PHONE, EGL.CUSTOMER.EMAIL_ADDRESS, 
      EGL.CUSTOMER.STREET, EGL.CUSTOMER.APARTMENT, 
      EGL.CUSTOMER.CITY, EGL.CUSTOMER."STATE", 
      EGL.CUSTOMER.POSTALCODE, EGL.CUSTOMER.DIRECTIONS
    from EGL.CUSTOMER
    order by
      EGL.CUSTOMER.CUSTOMER_ID asc
    SQL 빌더는 다양한 방식으로 SQL 코드를 표시합니다.
    • SQL 빌더의 맨 위에 있는 코드 편집기를 사용하여 EGL 편집기처럼 같이 SQL 문을 편집할 수 있습니다. 그러나, 이 편집기에는 SQL 문을 처리하는 추가 옵션이 있습니다. 예를 들어, EGL 코드에서 이 편집기로 기본 SQL 문을 붙여넣을 때 SQL 빌더는 이 명령문을 단순화하고 다시 포맷합니다.
      편집할 SQL 코드를 표시하는 SQL 빌더
      또한, 이 SQL 편집기는 SQL 문의 컨텐츠 지원도 제공합니다. EGL 컨텐츠 지원과 같이 Ctrl+Space를 눌러 제안사항 목록을 표시할 수 있습니다.
    • 맨 위에서 두 번째 섹션은 명령문 및 해당 열과 관련된 테이블의 그래픽 보기를 표시합니다. 열 옆의 선택란을 사용해 SELECT 문에서 열을 선택하거나 지울 수 있으며 편집기 영역을 마우스 오른쪽 단추로 클릭한 다음 테이블 추가를 클릭하여 명령문을 새 테이블에 추가할 수 있습니다. 테이블을 마우스 오른쪽 단추로 클릭하여 테이블의 옵션 목록도 표시할 수 있습니다.
      SQL 빌더의 그래픽 영역에 있는 메뉴를 마우스 오른쪽 단추로 클릭
    • 맨 아래 섹션은 명령문의 테이블 보기를 표시합니다. 명령문 편집 방법을 안내하는 테이블의 템플리트를 사용할 수 있습니다.
      SQL 빌더의
테이블 명령문 편집기 영역
    예를 들어, 다음과 같이 SQL 빌더의 테이블 영역을 사용하여 편집기의 SELECT 문에 WHERE절을 추가할 수 있습니다.
  12. SQL 빌더의 조건 탭으로 이동하십시오.
  13. 조건 탭에서 다음과 같이 명령문에 새 WHERE절을 추가하십시오.
    1. 조건 탭에서 열의 빈 행을 클릭하십시오.
    2. 의 빈 셀에서 CUSTOMER.POSTALCODE를 선택하십시오.
    3. 연산자에서 LIKE를 선택하십시오.
    4. 에 다음 코드를 입력하십시오.
      1%
      퍼센트 기호(%)는 SQL의 와일드 카드입니다. 이 WHERE절은 명령문을 숫자 1로 시작하는 우편번호를 가진 고객으로 제한합니다.
    선택 조건은 테이블 영역의 다음과 같습니다.
    SQL 빌더의 새 선택
조건
    조건 추가를 완료하고 다른 위치에 초점을 설정하면 SQL 빌더가 편집기에서 SELECT 문의 코드를 갱신합니다.
    SQL 빌더의 SQL 문 코드
  14. SQL 빌더의 맨 위에 있는 코드 편집기를 마우스 오른쪽 단추로 클릭한 다음 SQL 실행을 클릭하십시오.
    SQL 빌더의 코드 편집 영역에서 실행된 SQL 실행 컨텍스트
메뉴 옵션
    데이터 출력 보기는 명령문의 결과를 표시합니다. 이 경우, 1로 시작하는 우편번호를 가진 고객을 표시합니다.
    명령문의 결과를 표시하는 데이터 출력 보기
    SQL에 익숙한 경우 여기에 고유 SQL 문을 작성한 다음 응용프로그램에서 사용하기 전에 테스트할 수 있습니다.
  15. SQL 빌더 사용을 완료하면 코드를 파일로 저장하거나 버릴 수 있습니다.
  16. 보다 강력한 예제로서, CUSTOMER 테이블의 디자인을 복사하여 새 테이블을 작성할 SQL 문을 작성하십시오.
    1. 데이터베이스 탐색기 보기에서 CUSTOMER 테이블을 마우스 오른쪽 단추로 클릭한 다음 DDL 생성을 클릭하십시오.
    2. DDL 생성 창에서 CREATE 문 선택란을 선택하고 다른 선택란은 지우십시오.
      DDL 생성 창
    3. 다음을 클릭하십시오.
    4. 오브젝트 페이지에서 모두 선택을 클릭하십시오.
    5. 다음을 클릭하십시오.
    6. 폴더 필드에서 EGLSQL 프로젝트를 선택하십시오.
    7. DDL 파일 저장 및 실행 페이지에서 파일의 이름을 createtable.sql로 지정하십시오.
    8. 서버에서 DDL 실행 선택란을 지우십시오.
    9. 편집을 위해 DDL 파일 열기 선택란을 선택하십시오. DDL 저장 및 실행 페이지는 다음과 같습니다.
      DDL 생성 마법사의 끝에서 두 번째 페이지
    10. 다음을 클릭하십시오.
    11. 완료를 클릭하십시오.
    SQL 빌더처럼 작동하지만 코드 편집 영역만 있으며 추가 그래픽 영역은 없는 SQL 문 편집기에 새 SQL 문이 열립니다.
  17. 명령문을 편집하여 작성된 테이블의 이름을 CUSTOMER가 아닌 EGL.CUSTOMERTEMP로 변경하십시오. 편집한 SQL 코드는 다음과 같습니다.
    CREATE TABLE EGL.CUSTOMERTEMP (
        CUSTOMER_ID INTEGER NOT NULL,
        FIRST_NAME VARCHAR(30),
        LAST_NAME VARCHAR(30),
        PASSWORD CHAR(8),
        PHONE VARCHAR(14),
        EMAIL_ADDRESS VARCHAR(50),
        STREET VARCHAR(30),
        APARTMENT VARCHAR(10),
        CITY VARCHAR(30),
        STATE CHAR(2),
        POSTALCODE VARCHAR(10),
        DIRECTIONS VARCHAR(255)
      );
  18. 명령문을 저장하십시오.
  19. 데이터베이스 탐색기 보기에서 EGLDerbyR7 데이터베이스를 마우스 오른쪽 단추로 클릭한 다음 연결 끊기를 클릭하여 데이터베이스에서 연결을 끊으십시오.
이제, 데이터베이스의 새 테이블을 작성할 SQL 문이 생겼습니다. 그러나, EGL에는 SQL CREATE 문과 동등한 명령문이 없으며 get은 데이터베이스로부터의 결과 세트를 요구하므로 get과 같은 명령문의 명시적 SQL에 이 명령문을 삽입할 수 없습니다. 다음 섹션에서는 execute를 사용하여 EGL에서 이 SQL 명령문을 실행할 것입니다.

execute 사용

데이터 Perspective에서 도구를 사용하여 새 CREATE 문을 실행할 수 있지만 EGL 응용프로그램에서 사용자 정의 SQL 코드를 실행해야 하는 경우도 있습니다. EGL 응용프로그램에 사용자 정의된 SQL 코드를 삽입할 때마다 예상한대로 작업을 수행하는지 철저히 테스트해야 합니다.

EGL execute 문을 사용하여 SQLRecord 변수를 처리하지 않고 SQL 코드를 실행할 수 있습니다. execute를 사용하여 다양한 SQL 문(CREATE, ALTER, and DROP TABLE, INSERT, DELETE 및 UPDATE)을 실행할 수 있습니다. 예를 들어, 다음과 같이 데이터베이스에서 테이블을 제거할 수 있습니다.
execute #sql{
  DROP TABLE OLD_TABLE;
}

execute 문은 일부 SQL 문(특히, SELECT 및 OPEN)을 지원하지 않습니다. execute와 작동하거나 작동하지 않는 SQL 문 목록은 SQL의 execute 고려사항을 참조하십시오.

다음과 같이 execute를 사용하여 스토어드 프로시저를 호출할 수도 있습니다.
execute #sql{ 
  call aStoredProcedure( :parameterVar) 
};
Derby는 대부분의 데이터베이스 관리 시스템과 같은 방식으로 스토어드 프로시저를 지원하지 않으므로 이 학습서는 스토어드 프로시저를 다루지 않습니다. 대신, 이 절에서는 execute를 사용하여 데이터베이스에 테이블을 작성한 다음 SQLRecord 파트를 사용하지 않고 이 테이블을 데이터로 채웁니다.
  1. EGL Perspective로 되돌아가십시오.
  2. libraries 패키지에서 CustomerTableOperations.egl이라는 파일의 새 라이브러리 파트를 작성하십시오.
  3. execCreateTable, execInsertIntoTableexecDropTable이라는 새 함수를 라이브러리에 삽입하십시오. 각 함수는 매개변수로 StatusRec 레코드 변수를 받습니다.
    function execCreateTable(status StatusRec inOut)
      
    end
    
    function execInsertIntoTable(status StatusRec inOut)
      
    end
    
    function execDropTable(status StatusRec inOut)
      
    end
    StatusRec 레코드 변수는 데이터베이스 오퍼레이션의 성공 또는 실패에 대한 정보를 기록합니다.
  4. 컨텐츠 지원을 사용하여 매개변수를 추가하지 않은 경우 다음 import 문을 파일의 맨 위 package 문 바로 아래 추가하십시오.
    import eglderbyr7.StatusRec;
  5. execCreateTable 함수에서 execute 문을 사용하여 이전 절에서 작성한 CREATE TABLE 문을 실행하십시오.
    function execCreateTable(status StatusRec inOut)
      try
        execute 
          #sql{
            CREATE TABLE EGL.CUSTOMERTEMP (
                CUSTOMER_ID INTEGER NOT NULL,
                FIRST_NAME VARCHAR(30),
                LAST_NAME VARCHAR(30),
                PASSWORD CHAR(8),
                PHONE VARCHAR(14),
                EMAIL_ADDRESS VARCHAR(50),
                STREET VARCHAR(30),
                APARTMENT VARCHAR(10),
                CITY VARCHAR(30),
                STATE CHAR(2),
                POSTALCODE VARCHAR(10),
                DIRECTIONS VARCHAR(255)
              )
            };
      onException (exception SQLException)
        ConditionHandlingLib.HandleException(status, exception);
      end
      
    end
    이 함수가 테이블을 작성한 다음 데이터베이스에서 데이터 파트 및 논리 파트와 함께 작성된 HandleSuccess 함수를 사용하여 모든 오류를 처리합니다.
  6. 컨텐츠 지원을 사용하여 이 코드를 추가하지 않은 경우 다음 import 문을 파일의 맨 위에 추가하십시오.
    import eglderbyr7.ConditionHandlingLib;
  7. execDropTable 함수에서, 데이터베이스에서 테이블을 제거하는 execute 문을 추가하십시오.
    function execDropTable(status StatusRec inOut)
      try  
        execute #sql{
         DROP TABLE EGL.CUSTOMERTEMP
           } ;
        onException (exception SQLException)
          ConditionHandlingLib.HandleException(status, exception);
        end
    end
  8. execInsertIntoTable 함수에서, CUSTOMER 테이블에서 CUSTOMERTEMP 테이블로 레코드를 이동하는 execute 문을 추가하십시오.
    function execInsertIntoTable(status StatusRec inOut)
      try  
        execute #sql{
        INSERT INTO EGL.CUSTOMERTEMP 
          SELECT * FROM EGL.CUSTOMER
           } ;
      onException (exception SQLException)
        ConditionHandlingLib.HandleException(status, exception);
      end
    end
    이 코드는 CUSTOMER에서 CUSTOMERTEMP로 각 레코드를 복사하기만 합니다. 원하는 경우 복사하려는 특정 레코드만 선택하도록 WHERE절을 추가할 수 있습니다.
  9. 라이브러리를 저장하고 생성하십시오.
  10. programs 패키지에서 duplicateTable.egl이라는 파일에 새 프로그램 파트를 작성하십시오.
  11. 새 프로그램에서 새 테이블을 작성한 다음 레코드를 삽입하는 함수를 호출하십시오.
    package programs;
    
    import eglderbyr7.StatusRec;
    import libraries.CustomerTableOperations;
    
    program duplicateTable type BasicProgram {}
      
      status StatusRec;
      
      function main()
        CustomerTableOperations.execCreateTable(status);
        CustomerTableOperations.execInsertIntoTable(status);
      end
      
    end
  12. 프로그램을 생성하고 실행하십시오.
  13. 데이터 Perspective로 돌아온 다음 데이터베이스 탐색기 보기에서 데이터베이스에 다시 연결하십시오.
  14. 이전 절에서와 같이 새 테이블의 데이터 미리보기를 수행하여 새 테이블과 해당 데이터를 확인하십시오.
    1. EGLDerbyR7 > EGLDerbyR7 > 스키마 > EGL > 테이블을 펼치십시오.
    2. CUSTOMERTEMP 테이블을 마우스 오른쪽 단추로 클릭한 다음 데이터 > 샘플 컨텐츠를 클릭하십시오.
이제, 새 테이블의 데이터를 확인할 수 있습니다.
새 테이블을 표시하는 데이터 출력 보기
이제, 새 테이블과 작동할 기타 명령문을 작성하거나 execDropTable 함수를 호출하여 데이터베이스에서 제거할 수 있습니다. 예를 들어, CREATE TABLE 문과 함께 작성된 ALTER TABLE 및 CREATE INDEX 문을 실행할 수도 있습니다. 하지만, 이 경우 Derby가 1차 키 제한조건의 중복된 이름을 허용하지 않으므로 제한조건 및 색인의 이름을 바꾸어야 합니다. 데이터베이스에 액세스하는 EGL 코드를 실행하기 전에 데이터베이스 탐색기 보기에서 데이터베이스에 대한 연결을 끊도록 하십시오.

이 학습에서 사용하는 두 파일의 전체 코드를 살펴보십시오. 파일에 빨간색 X 기호로 표시된 오류가 나타나면 사용자의 코드가 학습 6에서 완성된 CustomerTableOperations.egl 및 duplicateTable.egl 파일의 코드와 일치하는지 확인하십시오.

학습 체크포인트

이 학습에서는 Workbench의 일부 데이터베이스 관리 도구 및 해당 도구를 execute문과 결합하여 EGL 응용프로그램에서 매우 다양한 SQL 문과 실행하는 방법에 대해 배웠습니다.

Workbench의 데이터 액세스 도구에 대한 자세한 정보는 SQL 문에 대한 작업을 참조하십시오. EGL execute 문에 대한 자세한 정보는 execute를 참조하십시오.