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 문을 실행하는 두 가지 옵션(native와 select)을 제공해요.
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 문은 한 줄을 출력하며 프로그램을 디버깅하는 데 유용해요. 이 문은 줄 종결자(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에서 문, 함수, 언어 요소 전체 목록을 확인할 수 있어요.
- 개별 문의 자세한 내용은 위의 각 문 하단 링크를 통해 개별 페이지를 참고할 수 있어요.