HPL/SQL 문

HPL/SQL 문 (Statements) 레퍼런스

HPL/SQL은 SQL을 절차적으로 작성할 수 있게 해주는 언어로, 이 페이지에는 사용 가능한 모든 문(statement)이 정리되어 있어요. 커서, 루프, 조건 분기, 예외 처리, 테이블 생성·조작, 동적 SQL 실행 등 DBMS에서 쓰는 절차적 기능을 거의 모두 지원하므로 기존 프로시저 코드를 그대로 Hive 위에서 돌릴 수 있답니다.

출처: 문서

본문

ALLOCATE CURSOR

ALLOCATE CURSOR 문은 커서를 선언하고 이를 저장 프로시저에서 반환된 결과 집합과 연결할 수 있게 해줘요.

구문 (Syntax):

ALLOCATE cursor_name CURSOR FOR PROCEDURE procedure_name;  -- Teradata 호환
|
ALLOCATE cursor_name CURSOR FOR RESULT SET locator_name;   -- DB2 호환

예제 1:

단일 결과 집합을 반환하는 저장 프로시저 예시:

CREATE PROCEDURE spOpenIssues 
  DYNAMIC RESULT SETS 1
BEGIN
  DECLARE cur CURSOR WITH RETURN FOR
    SELECT id, name FROM issues;
  OPEN cur;
END;

저장 프로시저를 호출하고 반환된 결과 집합을 처리합니다 (Teradata 호환).

ASSOCIATE LOCATOR

ASSOCIATE LOCATOR 문은 locator 변수를 저장 프로시저에서 반환된 결과 집합과 연결할 수 있게 해줘요.

그런 다음 ALLOCATE CURSOR 문으로 locator에 커서를 할당하고 데이터를 가져올 수 있어요.

구문 (Syntax):

ASSOCIATE [RESULT SET] LOCATOR | LOCATORS (loc [, locN, ...]) 
  WITH PROCEDURE procedure_name

예제는 ALLOCATE CURSOR 문을 참고해요.

호환성 (Compatibility): IBM DB2

BREAK

BREAK 문은 가장 안쪽 루프를 종료해요.

구문 (Syntax):

BREAK;

예제 (Example):

DECLARE count INT DEFAULT 3;
WHILE 1=1 BEGIN
  SET count = count - 1;
  IF count = 0
    BREAK;
END

호환성 (Compatibility): Microsoft SQL Server.

CALL

CALL 문은 저장 프로시저를 실행할 수 있게 해줘요.

구문 (Syntax):

CALL procedure_name [(parameter, ...)];

예제 (Example):

프로시저를 정의하고 매개변수를 넘겨 호출해요:

CREATE PROCEDURE set_message(IN name STRING, OUT result STRING)
BEGIN
 SET result = 'Hello, ' || name || '!';
END;

-- 이제 프로시저를 호출하고 결과를 출력
DECLARE str STRING;
CALL set_message('world', str);
PRINT str;

Result:
--
Hello, world!

호환성 (Compatibility): Teradata, IBM DB2 및 MySQL

CLOSE

CLOSE 문은 커서를 닫아요.

구문 (Syntax):

CLOSE cursor_name;

매개변수 (Parameters):

매개변수 타입 설명
cursor_name 식별자 이전에 연 커서의 이름

예제 (Examples):

DECLARE id INT;
DECLARE cur CURSOR FOR 'SELECT id FROM db.orders';
OPEN cur;
FETCH cur INTO id;
CLOSE cur;

호환성 (Compatibility): Oracle, IBM DB2, Teradata, SQL Server, PostgreSQL, MySQL.

더 보기 (See also):

CMP

CMP 문은 같은 데이터베이스 또는 서로 다른 데이터베이스에 있는 테이블의 데이터를 비교하는 데 도움을 줘요.

구문 (Syntax):

전체 행 수를 비교:

CMP ROW_COUNT table1 [where_clause1] | (select_stmt1) [AT conn1], 
              table2 [where_clause2] | (select_stmt2) [AT conn2]

컬럼 요약(컬럼에 COUNT, SUM, MIN, MAX 적용)을 비교:

CMP SUM table1 [where_clause1] [AT conn1], table2 [where_clause2] [AT conn2]

참고 (Notes):

  • 데이터가 같으면 CMP 문은 SQLCODE를 0으로 설정해요. 데이터가 다르면 SQLCODE는 1로 설정돼요. 어떤 SQL 오류가 발생하면 SQLCODE는 -1로 설정돼요.
  • 커넥션 프로파일을 지정하지 않으면 지정된 테이블에 기본 커넥션 프로파일이 사용돼요.

CREATE DATABASE

CREATE DATABASE 문은 데이터베이스를 생성할 수 있게 해줘요.

구문 (Syntax):

CREATE DATABASE | SCHEMA [IF NOT EXISTS] dbname_expr
  [COMMENT comment_expr]
  [LOCATION path_expr]

예제 (Example):

testYYYYMMDD(오늘 날짜) 이름의 데이터베이스를 생성:

create database 'test' || replace(current_date, '-', '');

호환성 (Compatibility): MySQL, MariaDB, Hive

더 보기 (See also):

CREATE FUNCTION

CREATE FUNCTION 문은 사용자 정의 SQL 함수를 만들 수 있게 해줘요.

구문 (Syntax):

ALTER | CREATE [OR REPLACE] | REPLACE FUNCTION function_name ( [parameters] )
 RETURNS | RETURN data_type
 [AS | IS] 
 body

parameters:
  [IN] name data_type, ...
  |
  name [IN] data_type, ...

body:
  statement | expression | BEGIN statements END

예제 1:

매개변수 없는 함수 생성:

CREATE FUNCTION hello()
 RETURNS STRING
BEGIN
 RETURN 'Hello, world';
END;

-- 함수 호출
PRINT hello();

CREATE LOCAL TEMPORARY TABLE

CREATE LOCAL TEMPORARY TABLE 문은 현재 세션을 위한 임시 테이블을 만들 수 있게 해줘요.

구문 (Syntax):

CREATE LOCAL TEMPORARY TABLE table_name
(
   column_name data_type [NULL | NOT NULL]
   [, ...]
)
[ ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS]

참고 (Notes):

  • 로컬 임시 테이블은 세션이 끝나면 자동으로 삭제돼요.

HPL/SQL에서 임시 테이블 지원이 어떻게 구현되는지 자세한 내용은 Native and Managed Temporary Tables를 참고해요.

CREATE PACKAGE

CREATE PACKAGE 문은 관련된 변수, 프로시저, 함수의 모음을 정의할 수 있게 해줘요.

구문 (Syntax)

패키지 명세(specification):

[CREATE [OR REPLACE] | REPLACE] PACKAGE package_name AS | IS package_spec END

package_spec:
  variable declaration |
  function declaration |
  procedure declaration

패키지 본문(body):

[CREATE [OR REPLACE] | REPLACE] PACKAGE BODY package_name AS | IS package_body END

package_body:
  private variable declaration |
  function definition |
  procedure definition

CREATE PROCEDURE

CREATE PROCEDURE 문은 사용자 정의 SQL 프로시저(저장 프로시저)를 만들 수 있게 해줘요.

구문 (Syntax):

[ALTER | CREATE [OR REPLACE] | REPLACE] PROCEDURE | PROC procedure_name [parameters] 
 [AS | IS] 
 body

parameters:
  ([IN | OUT | INOUT | IN OUT] name data_type, ...)
  |
  (name [IN | OUT | INOUT | IN OUT] data_type, ...)

body:
  statement | expression | BEGIN statements END

CREATE TABLE

CREATE TABLE 문은 데이터베이스에 테이블을 생성해요.

구문 (Syntax):

CREATE TABLE [IF NOT EXISTS] table_name
(
   column_name data_type [NULL | NOT NULL]
   [, constraint ...]
   [, ...]
)

CREATE TABLE 변환 (Conversion)

CREATE TABLE 문이 Hive에서 지원하지 않는 문법으로 정의되면 Hive 문법에 맞게 자동으로 변환돼요.

현재 HPL/SQL은 데이터 타입을 변환하고, NOT NULL/NULL, 제약 조건, 기본값을 제거해요. 자세한 내용은 On-the-Fly Conversion을 참고해요.

CREATE VOLATILE TABLE

CREATE VOLATILE TABLE 문은 현재 세션을 위한 임시 테이블을 만들 수 있게 해줘요.

구문 (Syntax):

CREATE [SET | MULTISET] VOLATILE TABLE table_name
(
   column_name data_type [NULL | NOT NULL]
   [, ...]
)
[ ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS]

참고 (Notes):

  • volatile 테이블은 세션이 끝나면 자동으로 삭제돼요.

HPL/SQL에서 임시 테이블 지원이 어떻게 구현되는지 자세한 내용은 Native and Managed Temporary Tables를 참고해요.

DECLARE CONDITION

DECLARE CONDITION 문을 사용해 사용자가 정의한 조건(condition)을 선언할 수 있어요.

그런 다음 DECLARE HANDLER로 이 조건에 대한 핸들러를 정의하고, SIGNAL 문으로 이 조건을 발생시킬 수 있어요.

구문 (Syntax):

DECLARE condition_name CONDITION;

예제 (Example):

행 수가 지정된 수와 같지 않으면 조건을 발생:

DECLARE cnt INT DEFAULT 0; 
DECLARE wrong_cnt_condition CONDITION;

DECLARE EXIT HANDLER FOR wrong_cnt_condition
  PRINT 'Wrong number of rows';  

SELECT COUNT(*) INTO cnt FROM TABLE (VALUES (1,2));

IF cnt <> 1 THEN
  SIGNAL wrong_cnt_condition;
END IF;

호환성 (Compatibility): IBM DB2, Teradata 및 MySQL.

DECLARE CURSOR

DECLARE CURSOR 문을 사용해 동적 SQL로 커서를 선언할 수 있어요.

구문 (Syntax):

DECLARE name CURSOR FOR | AS | IS dynamic_sql_string | select_statement;

매개변수 (Parameters):

매개변수 타입 설명
dynamic_sql_string VARCHAR 변수 또는 표현식 커서를 정의하는 동적 SQL
select_statement 커서를 정의하는 SQL SELECT 문

참고 (Notes):

  • dynamic_sql_string 표현식은 선언 시점이 아니라 커서를 열 때(open time) 평가돼요.

DECLARE HANDLER

DECLARE HANDLER 문을 사용해 조건이 발생했을 때 실행할 하나 이상의 HPL/SQL 문을 정의할 수 있어요.

구문 (Syntax):

DECLARE [CONTINUE | EXIT] HANDLER FOR 
  [SQLEXCEPTION | NOT FOUND | user_condition] code_block;

설명 (Description):

매개변수 설명
CONTINUE 핸들러가 완료되면, 조건을 발생시킨 문 다음의 HPL/SQL 문으로 제어가 반환됨
EXIT 핸들러가 완료된 후, 핸들러를 선언한 블록의 끝으로 제어가 반환됨
code_block 지정된 조건이 발생했을 때 실행할 HPL/SQL 문

DECLARE TEMPORARY TABLE

DECLARE TEMPORARY TABLE 문은 현재 세션을 위한 임시 테이블을 정의할 수 있게 해줘요.

구문 (Syntax):

DECLARE [GLOBAL] TEMPORARY TABLE table_name
(
   column_name data_type [NULL | NOT NULL]
   [, ...]
)
[ ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS]

호환성 옵션 (Compatibility Options)

다른 데이터베이스와의 호환성을 위해 다음 옵션이 지원돼요.

IBM DB2:

IN tablespace_name
WITH REPLACE
DISTRIBUTE BY HASH (col, ...) 
LOGGED | NOT LOGGED

자세한 내용은 Native and Managed Temporary Tables를 참고해요.

DESCRIBE

DESCRIBE 문은 지정된 데이터베이스 객체에 대한 메타데이터 정보를 출력할 수 있게 해줘요.

구문 (Syntax):

DESCRIBE | DESC [TABLE] table_name

예제 (Example):

Hive에서 src 테이블을 설명:

desc src;
--
key                     string                  default
value                   string                  default

호환성 (Compatibility): Oracle, IBM DB2, Hive, MySQL, MariaDB.

DROP DATABASE

DROP DATABASE 문은 데이터베이스를 삭제할 수 있게 해줘요.

구문 (Syntax):

DROP DATABASE | SCHEMA [IF EXISTS] dbname_expr

예제 (Example):

testYYYYMMDD(오늘 날짜) 이름의 데이터베이스를 삭제:

drop database if exists 'test' || replace(current_date, '-', '');

호환성 (Compatibility): Hive

더 보기 (See also):

DROP TABLE

DROP TABLE 문은 테이블을 삭제해요.

구문 (Syntax):

DROP TABLE [IF EXISTS] table_name

호환성 (Compatibility): Oracle, Microsoft SQL Server, IBM DB2, Teradata, PostgreSQL, MySQL, Hive

더 보기 (See also):

EXECUTE

EXECUTE(EXEC 또는 EXECUTE IMMEDIATE) 문은 동적 SQL 문을 실행하고 스칼라 결과를 로컬 변수로 반환할 수 있어요.

이 문을 사용해 저장 프로시저를 호출할 수도 있어요.

구문 (Syntax):

EXEC | EXECUTE | EXECUTE IMMEDIATE dynamic_sql_string [INTO var1, var2, ...];
|
EXEC | EXECUTE proc_name [parm1 = val1, ... ]

매개변수 (Parameters):

매개변수 타입 설명
dynamic_sql_string VARCHAR 변수 또는 표현식 실행할 동적 SQL
INTO var1, var2, … Any 변수 할당할 변수, 선택 사항

EXIT WHEN

EXIT WHEN 문은 주어진 레이블로 표시된 루프 또는 블록을 종료해요. 레이블이 지정되지 않으면 가장 안쪽 루프를 빠져나와요.

불리언 표현식이 지정되고 그 값이 true로 평가되면 EXIT 문이 실행되고, 그렇지 않으면 무시되고 EXIT 다음 문부터 실행이 계속돼요.

구문 (Syntax):

EXIT [label] [WHEN boolean_expression];

예제 (Example):

WHILE count > 0 LOOP
  count := count - 1;
  EXIT WHEN count = 0;
END LOOP;
<<lbl>>
WHILE 1=1 LOOP
  <<lbl1>>
  WHILE 1=1 LOOP
    EXIT lbl;
  END LOOP;
END LOOP;

호환성 (Compatibility): Oracle, PostgreSQL 및 Netezza.

FETCH

FETCH 문은 커서에서 다음 행을 가져와 컬럼 값을 로컬 변수에 할당해요.

구문 (Syntax):

FETCH [FROM] cursor_name INTO var1 [, var2, ...];

매개변수 (Parameters):

매개변수 타입 설명
cursor_name 식별자 이전에 연 커서의 이름
varN 변수 로컬 변수

예제 (Examples):

DECLARE tabname VARCHAR DEFAULT 'db.orders';
DECLARE id INT;
DECLARE cur CURSOR FOR 'SELECT id FROM ' || tabname;
OPEN cur;
FETCH cur INTO id;
WHILE SQLCODE=0 THEN
  PRINT id;
  FETCH cur INTO id;
END WHILE;
CLOSE cur;

호환성 (Compatibility): Oracle, IBM DB2, Teradata, SQL Server, MySQL, PostgreSQL 및 Netezza.

FOR 문 (커서 루프, Cursor Loop)

FOR 문은 커서를 열고, 각 행에 대해 하나 이상의 문을 반복 실행한 뒤 커서를 닫아요.

구문 (Syntax):

FOR cur_name IN [(] select_stmt [)] LOOP
  statements
END LOOP;

참고 (Notes):

  • cur_name.col_name 문법을 사용해 커서 컬럼을 참조할 수 있어요.

예제 (Example):

FOR item IN (
    SELECT dname, loc as location
    FROM dept
    WHERE dname LIKE '%A%'
    AND deptno > 10
    ORDER BY location)
LOOP
  DBMS_OUTPUT.PUT_LINE('Name = ' || item.dname || ', Location = ' || item.location);
END LOOP;

호환성 (Compatibility): Oracle, PostgreSQL 및 Netezza

FOR 문 (정수 범위, Integer Range)

FOR 문은 지정된 정수 값 범위에 대해 하나 이상의 문을 반복 실행해요.

구문 (Syntax):

FOR index IN [REVERSE] lower_bound..upper_bound [BY | STEP increment] LOOP
  statements
END LOOP;

참고 (Notes):

  • index - 암시적으로 선언된 정수 변수
  • REVERSE를 지정하면 index가 감소해요.
  • 지정하면 BY(또는 STEP)가 반복 단계를 정의하며, 기본값은 1이에요.

예제 (Examples):

FOR i IN 1..10 LOOP
  -- i는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 값
END LOOP;
FOR i IN REVERSE 10..1 LOOP
  -- i는 10, 9, 8, 7, 6, 5, 4, 3, 1, 1 값
END LOOP;
FOR i IN 1..10 BY 2 LOOP
  -- i는 1, 3, 5, 7, 9 값
END LOOP;

호환성 (Compatibility): Oracle, PostgreSQL 및 Netezza.

GET DIAGNOSTICS

GET DIAGNOSTICS 문은 이전 SQL 문에 대한 오류 메시지, 행 수를 검색할 수 있게 해줘요.

구문 (Syntax):

오류 텍스트 가져오기:

GET DIAGNOSTICS EXCEPTION 1 var_name = MESSAGE_TEXT;

이전 SQL 문과 관련된 행 수 가져오기:

GET DIAGNOSTICS var_name = ROW_COUNT;

중요 참고 (Important Note):

  • Hive는 INSERT 문에 대해 JDBC Statement.getUpdateCount()를 지원하지 않으므로, GET DIAGNOSTICS ROW_COUNT는 Hive 0.13 이하에서 0을, Hive 0.14 이상에서 -1을 반환해요. 자세한 내용은 HIVE-7680을 참고해요.

호환성 (Compatibility): IBM DB2

IF 문

IF 문은 불리언 표현식의 값에 따라 일련의 문장을 실행해요.

HPL/SQL은 IF 문에 대해 여러 문법을 지원해요.

IF - THEN - ELSIF/ELSEIF - ELSE - END IF

구문 (Syntax):

IF boolean_expression THEN
  statements
[ELSIF | ELSEIF THEN
  statements
...]
[ELSE
  statements]
END IF;

예제 (Example):

IF state = 'CA' THEN
  code := 1;
ELSIF state = 'NY' THEN
  code := 2;
ELSIF state = 'MA' THEN
  code := 3;
ELSE
  code := 5;
END IF;

호환성 (Compatibility): Oracle, Teradata, IBM DB2, MySQL, PostgreSQL, Netezza.

INCLUDE

INCLUDE 문은 다른 HPL/SQL 스크립트에서 문을 포함할 수 있게 해줘요.

사용자 정의 함수와 저장 프로시저를 별도의 HPL/SQL 스크립트에 정의한 뒤 INCLUDE 문을 사용해 현재 스크립트에서 사용 가능하게 할 수 있어요.

또한 .hplsqlrc 설정 파일에 INCLUDE 문을 넣을 수 있는데, 그러면 이 함수와 프로시저가 데이터베이스의 영구 객체처럼 항상 사용자에게 제공돼요.

INSERT DIRECTORY

INSERT DIRECTORY 문은 쿼리 결과를 로컬 또는 HDFS 호환 파일 시스템에 쓸 수 있게 해줘요.

구문 (Syntax):

INSERT OVERWRITE [LOCAL] DIRECTORY directory select_statement

참고 (Notes):

  • directory는 대상 디렉토리(경로, 변수 또는 표현식)를 지정해요.
  • select_statement는 쿼리를 지정해요 (동적 SQL 문자열도 사용할 수 있어요).

예제 (Examples):

판매 데이터 내보내기:

insert overwrite directory '/data/sales_daily' select * from sales_daily;

INSERT

INSERT 문은 테이블에 행을 삽입해요.

구문 (Syntax):

SELECT에서 삽입:

INSERT OVERWRITE TABLE table_name select_statement
| 
INSERT INTO [TABLE] table_name select_statement

값 삽입:

INSERT INTO [TABLE] table_name VALUES (exrp, expr2, ...) [, (exrp, expr2, ...), ...]

INSERT VALUES

HPL/SQL은 INSERT VALUES 문을 실행하는 두 가지 옵션(nativeselect)을 제공해요.

hplsql.insert.values 옵션으로 INSERT VALUES 문을 어떻게 처리할지 정의하며, 기본값은 native예요.

LEAVE

LEAVE 문은 주어진 레이블로 표시된 루프 또는 블록을 종료해요. 레이블이 지정되지 않으면 가장 안쪽 루프를 빠져나와요.

구문 (Syntax):

LEAVE [label];

예제 (Example):

lbl:
WHILE count > 0 DO
  SET count = count - 1;
  IF count = 0 THEN
    LEAVE lbl;
  END IF;
END WHILE;
lbl:
WHILE 1=1 DO
  lbl1:
  WHILE 1=1 DO
    LEAVE lbl;
  END WHILE;
END WHILE;

호환성 (Compatibility): Teradata, IBM DB2 및 MySQL.

LOOP

LOOP 문은 EXIT, LEAVE, BREAK 문을 사용하거나 예외를 발생시켜 루프를 빠져나갈 때까지 하나 이상의 문을 실행해요.

구문 (Syntax):

[<<label>> | label:]
LOOP
  statements
END LOOP;

예제 (Examples):

-- Oracle, PostgreSQL, Netezza
LOOP
  count := count - 1;
  EXIT WHEN count = 0;
END LOOP;
-- DB2, Teradata, MySQL
lbl:
LOOP
  SET count = count - 1;
  IF count = 0 THEN
    LEAVE lbl;
  END IF;
END LOOP;

호환성 (Compatibility): Oracle, Teradata, IBM DB2, MySQL, PostgreSQL 및 Netezza.

MAP OBJECT

MAP OBJECT 문은 객체(테이블 또는 뷰)를 커넥션 프로파일에 매핑할 수 있게 해줘요. 이 문을 사용해 HPL/SQL 스크립트에서 사용하는 객체 이름을 데이터베이스의 실제 객체 이름에 매핑할 수도 있어요.

객체에 연결된 커넥션 프로파일에 따라 HPL/SQL은 단일 스크립트 안에서 여러 데이터베이스와 협력해 서로 다른 객체에 접근할 수 있어요.

NULL

NULL 문은 no-op(아무것도 하지 않음) 문으로, 제어를 다음 문으로 넘길 뿐이에요.

구문 (Syntax):

NULL;

예제 (Example):

declare 
  code char(1) := 'a';
begin
  null;
end;

호환성 (Compatibility): Oracle

OPEN

OPEN 문은 커서를 열어요.

구문 (Syntax):

OPEN cursor_name [FOR expression | select_statement];

설명 (Description):

매개변수 설명
cursor_name FOR 절을 지정하지 않으면 이전에 선언한 커서의 이름
FOR expression 동적 SQL을 담은 변수 또는 표현식
FOR select_statement SELECT 문

예제 (Examples):

이전에 선언한 커서 열기:

DECLARE tabname VARCHAR(20) DEFAULT 'db.orders';
DECLARE id INT;
DECLARE cur CURSOR FOR 'SELECT id FROM ' || tabname;
OPEN cur;
FETCH cur INTO id;
WHILE SQLCODE=0 THEN  
  PRINT id;
  FETCH cur INTO id;
END WHILE;
CLOSE cur;

PRINT

PRINT 문은 한 줄을 출력하며 프로그램을 디버깅하는 데 유용해요. 이 문은 줄 종결자(line terminator)를 추가해요.

구문 (Syntax):

PRINT exp
or
PRINT(exp)

매개변수 (Parameters):

매개변수 타입 설명
exp VARCHAR 텍스트 문자열 또는 표현식

반환값 (Return Value):

없음 (No).

예제 (Examples):

PRINT 'Hello, world!';
PRINT 'Hello, ' || 'world!';
PRINT('Hello, world!');

호환성 (Compatibility): Microsoft SQL Server

RESIGNAL

RESIGNAL 문은 조건 또는 예외 핸들러에서 오류를 다시 발생시켜 더 상위 레벨에서 처리되도록 하는 데 사용돼요.

구문 (Syntax):

RESIGNAL
|
RESIGNAL SQLSTATE [VALUE] sqlstate [SET MESSAGE_TEXT = message_text]

예제 1:

같은 오류를 다시 발생:

BEGIN
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  BEGIN
    PRINT 'Error raised';
    RESIGNAL;
  END;
  PRINT 'Before executing SQL';
  SELECT * FROM abc.abc;      -- 테이블이 존재하지 않아 오류 발생
  PRINT 'After executing SQL - will not be printed in case of error';
END;

RETURN

RETURN 문은 루틴에서 반환할 때 사용해요.

구문 (Syntax):

RETURN [expr];

매개변수 (Parameters):

매개변수 타입 설명
expr INT 변수 또는 표현식 반환값

참고 (Notes):

  • 반환값을 지정하지 않으면 0이 반환돼요.

예제 (Examples):

RETURN;

표현식의 결과를 반환:

RETURN NVL(v1, 1);

호환성 (Compatibility): Oracle, IBM DB2, SQL Server, Teradata, PostgreSQL, MySQL, Netezza.

SELECT INTO

SELECT INTO 문은 SQL SELECT 쿼리를 사용해 변수에 값을 할당할 수 있게 해줘요.

예제 (Example):

DECLARE cnt INT = 0;
SELECT COUNT(*) INTO cnt FROM users;
PRINT 'Users: ' || cnt;

호환성 (Compatibility): Oracle, IBM DB2, Teradata, PostgreSQL, MySQL 및 Netezza.

더 보기 (See also):

SELECT

SELECT 문은 쿼리를 실행할 수 있게 해줘요.

SELECT TOP n

TOP 절과 함께 SELECT 문을 지정할 수 있어요. PL/SQL은 Hive를 위해 자동으로 LIMIT 절로 변환해요.

예제 (Example):

SELECT TOP 3 name FROM sales;    -- SELECT name FROM sales LIMIT 3 실행

호환성 (Compatibility): Microsoft SQL Server.

FROM 절 없는 SELECT

FROM 없이 SELECT 문을 지정할 수 있어요. PL/SQL은 hplsql.dual.table 옵션으로 정의된 테이블 이름을 사용해 자동으로 FROM 절을 추가해요.

SET Session 옵션

SET 문은 세션 수준의 다양한 옵션을 설정할 수 있게 해줘요.

CURRENT SCHEMA

현재 스키마(데이터베이스) 변경:

구문 (Syntax):

SET [CURRENT] SCHEMA [=] schema_name;
|
SET CURRENT_SCHEMA [=] schema_name;

참고 (Note):

  • schema_name은 식별자, 문자열 리터럴 또는 표현식이에요.
  • HPL/SQL은 이 문을 Hive에서 USE schema_name 문으로 변환해요.

예제 (Example):

SET CURRENT SCHEMA = default;
SET SCHEMA = 'default';
SET SCHEMA 'def' || 'ault';

호환성 (Compatibility): IBM DB2

SIGNAL

SIGNAL 문은 사용자 정의 조건(예외)을 발생시켜요.

구문 (Syntax):

SIGNAL condition_name;

예제 (Example):

행 수가 지정된 수와 같지 않으면 조건을 발생:

DECLARE cnt INT DEFAULT 0; 
DECLARE wrong_cnt_condition CONDITION;

DECLARE EXIT HANDLER FOR wrong_cnt_condition
  PRINT 'Wrong number of rows';  

SELECT COUNT(*) INTO cnt FROM TABLE (VALUES (1,2));

IF cnt <> 1 THEN
  SIGNAL wrong_cnt_condition;
END IF;

호환성 (Compatibility): IBM DB2, Teradata 및 MySQL

TRUNCATE TABLE

TRUNCATE TABLE 문은 지정된 테이블의 모든 행을 제거해요.

구문 (Syntax):

TRUNCATE [TABLE] table_name

예제 (Example):

users2015 테이블의 모든 행을 제거:

truncate table users2015;

호환성 (Compatibility): Oracle, Microsoft SQL Server, IBM DB2, MySQL, Hive

더 보기 (See also):

UPDATE

UPDATE 문은 지정한 테이블에서 기존 행의 컬럼을 갱신할 수 있게 해줘요.

구문 (Syntax):

UPDATE table_name
  SET col = expr [, coln = exprn] ...
  [WHERE condition]

UPDATE table_name
  SET (col [, coln] ...) = (expr [, exprn] ... | select_statement)
  [WHERE condition]

USE

USE 문은 현재 커넥션에서 SQL 문에 사용되는 기본 데이터베이스를 변경할 수 있게 해줘요.

구문 (Syntax):

USE database_expr;

참고: HPL/SQL은 데이터베이스 이름을 지정할 때 표현식을 사용할 수 있어요.

예제 (Example):

USE sales;

USE SUBSTR(var, 1, 3);

호환성 (Compatibility): Hive, MySQL, MariaDB

더 보기 (See also):

VALUES INTO

VALUES INTO 문을 사용해 HPL/SQL에서 변수에 값을 할당할 수 있어요.

할당 전에 변수가 명시적으로 선언되지 않았다면 새 변수가 생성되고 데이터 타입은 할당 표현식에서 유도돼요.

구문 (Syntax):

VALUES expression INTO var;
|
VALUES (expression [, expression2, ...]) INTO (var [, var2, ...]);

예제 (Example):

VALUES 'A' INTO code;
VALUES (0, 100) INTO (count, limit);

호환성 (Compatibility): IBM DB2

WHILE

WHILE 문은 조건이 참인 동안 하나 이상의 문을 실행해요.

구문 (Syntax):

[<<label>> | label:]
WHILE boolean_expression LOOP | DO | BEGIN
  statements
END [LOOP | WHILE;]

예제 (Examples):

-- Oracle, PostgreSQL, Netezza
WHILE count > 0 LOOP
  count := count - 1;
END LOOP;
-- DB2, Teradata, MySQL
WHILE count > 0 DO
  SET count = count - 1;
END WHILE;
-- SQL Server
WHILE count > 0 BEGIN
  SET count = count - 1;
END

호환성 (Compatibility): Oracle, Teradata, IBM DB2, Microsoft SQL Server, MySQL, PostgreSQL 및 Netezza.

더 알아보기 (Learn more)

  • HPL/SQL Reference에서 문, 함수, 언어 요소 전체 목록을 확인할 수 있어요.
  • 개별 문의 자세한 내용은 위의 각 문 하단 링크를 통해 개별 페이지를 참고할 수 있어요.