SQL 스크립팅

SQL 스크립팅

SQL/PSM 표준 기반의 스크립팅 문법을 사용하면 강력한 절차적 로직을 쓸 수 있어요. 모든 SQL 스크립트는 복합문 블록(BEGIN ... END)으로 시작해서 그 블록으로 구성돼요. 복합문은 지역 변수, 커서(cursor), 사용자 정의 조건, 그리고 예외를 잡는 데 사용하는 조건 핸들러(condition handler)를 선언하는 부분으로 시작해요. 그 다음에 오는 복합문 본문은 다음으로 구성돼요.

  • 흐름 제어문: 술어 표현식에 대한 루프, 쿼리 결과에 대한 FOR 루프, IFCASE 같은 조건 논리, 그리고 LEAVEITERATE 같은 루프 탈출 방법.
  • ALTER, CREATE, DROP 같은 DDL 문.
  • INSERT 같은 DML 문.
  • 스크립트 호출자에게 결과 집합을 반환하는 쿼리.
  • 지역 변수와 세션 변수를 설정하는 SET 문.
  • EXECUTE IMMEDIATE 문.
  • OPEN, FETCH, CLOSE 문으로 하는 커서 처리.
  • 변수, 커서, 조건, 조건 핸들러에 중첩된 스코프를 제공하는 중첩 복합문.

호출자와 복합문 사이에 데이터 전달

SQL 스크립트로 데이터를 주고받는 방법은 두 가지가 있어요.

  • 세션 변수를 사용해서 스칼라 값이나 작은 배열·맵 집합을 한 SQL 스크립트에서 다른 스크립트로 전달.
  • 매개변수 마커를 사용해서 노트북 위젯, Python, 또는 다른 언어에서 SQL 스크립트로 스칼라 값이나 작은 배열·맵 데이터를 전달.

변수와 커서 스코프

복합문 안에서 선언된 변수는 복합문 안의 어떤 표현식에서든 참조할 수 있어요. Spark는 이름 해석에 설명된 규칙에 따라 가장 안쪽 스코프부터 바깥쪽으로 식별자를 해석해요. 중복된 변수 이름을 구분하려면 선택적인 복합문 레이블을 사용할 수 있어요.

복합문 안에서 선언된 커서는 해당 복합문 안의 OPEN, FETCH, CLOSE 문에서 참조할 수 있어요. 변수와 마찬가지로 중첩된 스코프에서 중복된 커서 이름을 구분하려면 선택적인 복합문 레이블을 사용할 수 있어요.

조건 처리

SQL 스크립팅은 조건 핸들러를 지원해요. 조건 핸들러는 예외를 가로채서 처리해 복합문을 EXIT하거나 실행을 CONTINUE하는 데 사용돼요.

조건 핸들러는 세 가지 구분되는 조건 클래스를 처리하도록 정의할 수 있어요.

  • DIVIDE_BY_ZERO 같은 Spark가 정의한 특정 오류 클래스이거나 사용자가 선언한 조건인, 하나 이상의 이름 있는 조건. 이런 핸들러는 이런 특정 조건들을 처리해요.
  • Spark가 발생시킬 수 있는 하나 이상의 SQLSTATE. 이런 핸들러는 해당 SQLSTATE와 연관된 어떤 조건이든 처리할 수 있어요.
  • 일반적인 SQLEXCEPTION 핸들러는 SQLEXCEPTION에 해당하는 모든 조건(XX***도 아니고 02***도 아닌 모든 SQLSTATE)을 잡을 수 있어요.
  • NOT FOUND 핸들러는 SQLSTATE 클래스가 '02xxx'인 모든 조건을 잡아요. 여기에는 커서 결과 집합의 끝을 넘어서 가져올 때 발생하는 CURSOR_NO_MORE_ROWS 조건도 포함돼요.

다음 규칙으로 어떤 조건 핸들러가 예외에 적용될지 정해요. 이 조건 핸들러를 가장 적절한 핸들러라고 불러요.

  • 조건 핸들러는 자기 자신의 본문이나 같은 복합문에서 선언된 어떤 조건 핸들러의 본문에 정의된 문에는 적용될 수 없어요.
  • 예외가 발생한 가장 안쪽 복합문에서 정의된 적용 가능한 조건 핸들러가 적절해요.
  • 적절한 핸들러가 하나보다 많으면 가장 구체적인 핸들러가 가장 적절해요. 예를 들어 이름 있는 조건에 대한 핸들러가 이름 있는 SQLSTATE에 대한 핸들러보다 더 구체적이에요. 일반적인 EXCEPTION 핸들러가 가장 덜 구체적이에요.

조건 핸들러의 결과는 다음과 같아요.

  • EXIT 핸들러는 자기 문을 실행한 다음, 그 핸들러를 선언한 복합문을 종료해요. 해당 복합문과 중첩된 복합문 안에서 열린 모든 커서는 암시적으로 닫혀요.
  • CONTINUE 핸들러는 자기 문을 실행한 다음, 조건을 발생시킨 문 바로 다음 문부터 실행을 계속해요.

다음은 지원되는 흐름 제어문 목록이에요.

다음은 커서 문 목록이에요.

출처: 문서

더 알아보기 (Learn more)