hive的语言元素

参考文档地址

http://www.hplsql.org/doc

数据类型

可以在HPL/SQL程序中使用以下数据类型:

数据类型 描述
BIGINT / INT8 64位整数
BINARY_DOUBLE 双精度浮点数
BINARY_FLOAT 单精度浮点数
BINARY_INTEGER 32位整数
BIT 0、1或NULL
BOOL / BOOLEAN 真或假
CHAR(n) / CHARACTER(n) 固定长度字符串
DECIMAL(p,s) 定点数
DATE 日期(年、月和日)
DATETIME 日期和时间
DOUBLE / DOUBLE PRECISION 双精度浮点数
FLOAT 单精度浮点数
INT / INTEGER / INT4 32位整数
NCHAR(n) 固定长度字符串
NVARCHAR(n) 变长字符串
NUMERIC(p,s) 定点数
NUMBER(p,s) 定点数
PLS_INTEGER 32位整数
REAL 单精度浮点数
RECORD 任意记录
SIMPLE_DOUBLE 双精度浮点数
SIMPLE_FLOAT 单精度浮点数
SIMPLE_INTEGER 32位整数
SMALLINT / INT2 16位整数
SYS_REFCURSOR 游标变量
TIMESTAMP 日期和时间
TINYINT 8位整数
VARCHAR(n) / VARCHAR(max) 变长字符串
VARCHAR2(n) 变长字符串
UTL_FILE.FILE_TYPE 文件句柄

数据类型转换

如果CREATE TABLE包含Hive不支持的数据类型,HPL/SQL会自动进行转换。

目前,HPL/SQL执行以下转换:

来源 Hive SQL
BIT TINYINT
DATETIME TIMESTAMP
INT(n) INT
INT2 SMALLINT
INT4 INT
INT8 BIGINT
NCHAR(n) STRING
NVARCHAR(n) STRING
NUMBER(p,s) DECIMAL(p,s)
NUMERIC(p,s) DECIMAL(p,s)
TEXT STRING
VARCHAR(MAX) STRING
VARCHAR2(n) STRING

语法声明

可以使用 DECLARE 块或语句来声明变量。

请注意,可以在单个程序中混合使用这两种语法。DECLARE 块和语句可以出现在程序的任何部分。

DECLARE 块

DECLARE 块具有以下语法:

sql 复制代码
DECLARE 
  var 数据类型 [NOT NULL] [:= | = | 默认表达式];
  ...
BEGIN
  ...
END;

HPL/SQL 还允许定义一个常量:

sql 复制代码
  var 常量 数据类型 := | 默认表达式

示例:

sql 复制代码
DECLARE
  code CHAR(10);
  status INT := 1;
  count SMALLINT = 0;
  limit INT 默认 100;  
  max_limit 常量 INT := 1000;
END;

兼容性: 声明块语法类似于 Oracle PL/SQL、PostgreSQL PL/pgSQL 和 Netezza NZPLSQL。

DECLARE 语句

DECLARE 语句具有以下语法:

sql 复制代码
DECLARE var [, var2, ...] [AS] 数据类型 [:= | = | 默认表达式] [, ...];

示例:

sql 复制代码
DECLARE code CHAR(10);
DECLARE status, status2 INT 默认 1;
DECLARE count SMALLINT, limit INT 默认 100;  

兼容性: 声明语句语法类似于 IBM DB2 SQL PL、Teradata、Microsoft SQL Server Transact-SQL 和 MySQL。

赋值

可以使用赋值运算符或语句在HPL/SQL中为变量设置新值。

如果在赋值之前没有明确声明变量,则会创建一个新变量,并且其数据类型将从赋值表达式中推导出来。

赋值运算符

可以使用赋值运算符 := 或 = 来设置值。

语法:

sql 复制代码
var [:= | = ] 表达式;

示例:

sql 复制代码
code := 'A';
status := 1;
count = 0;

兼容性: Oracle PL/SQL、PostgreSQL PL/pgSQL 和 Netezza NZPLSQL。

版本: PL/HQL 0.01

赋值语句

还可以使用 SET 语句为变量分配值。

语法:

sql 复制代码
SET var = 表达式 [, ...];
|
SET (var [, var2, ...]) = (表达式 [, 表达式2, ...])

示例:

sql 复制代码
SET code = 'A';
SET status = 1, count = 0;
SET (count, limit) = (0, 100);

兼容性: IBM DB2、Teradata、Microsoft SQL Server 和 MySQL。

版本: PL/HQL 0.01

从SELECT语句赋值

还可以使用 SET 语句从查询结果的第一行赋值:

语法:

sql 复制代码
SET var = (SELECT 列 FROM ...);
|
SET (var [, var2, ...]) = (SELECT 列 [, 列2, ... ] FROM ...);
|
SELECT var = 列 [, var2 = 列2, ...] FROM ...  -- 自HPL/SQL 0.3.11以来

示例:

sql 复制代码
SET code = (SELECT code FROM conf WHERE name = 'A');
SET (count, limit) = (SELECT count, limit FROM conf WHERE name = 'A');
SELECT @count = count, @limit = limit FROM conf WHERE name = 'A';

兼容性: IBM DB2、Teradata、Microsoft SQL Server 和 MySQL。

版本: PL/HQL 0.3.7

Date的用法

DATE字面量允许使用'YYYY-MM-DD'格式的字符串来指定一个日期常量。然后,可以在任何需要DATE数据类型的表达式中使用这个日期值。

示例

sql 复制代码
DATE '2014-12-20'
DATE '2014-12-20' + 1    -- 结果:日期类型的2014-12-21
DATE '2014-12-20' - 1    --         2014-12-19 

兼容性: Oracle、IBM DB2 和 Teradata

版本: PL/HQL 0.01

TimeStamp的用法

TIMESTAMP字面量允许使用'YYYY-MM-DD HH:MI:SS.FFF'或'YYYY-MM-DD-HH.MI.SS.FFF'格式的字符串来指定一个时间戳常量。

可以在任何需要TIMESTAMP数据类型的表达式中使用这个时间戳值。

示例

sql 复制代码
TIMESTAMP '2015-03-03 11:39:31.123'

TIMESTAMP '2015-03-03-11.39.31.123'   -- DB2语法

注意:

  • 小数部分是可选的

兼容性: Oracle、IBM DB2

版本: PL/HQL 0.03

间隔表达式

间隔表达式允许将间隔值添加或从DATE和TIMESTAMP值中减去。

语法

sql 复制代码
[INTERVAL] expression DAYS | DAY | MICROSECONDS | MICROSECOND

注意:

  • 由于Java的限制,MICROSECOND表达式会被转换为毫秒表达式。

示例1

将1天添加到DATE和TIMESTAMP值:

sql 复制代码
DATE '2015-03-12' + 1 DAY;
--
2015-03-13

TIMESTAMP '2015-03-12' + 1 DAY;
--
2015-03-13 00:00:00

示例2

将表达式的结果添加到DATE和TIMESTAMP值:

sql 复制代码
DATE '2015-03-12' + NVL(NULL, 3) DAYS;
--
2015-03-15

TIMESTAMP '2015-03-12' + NVL(NULL, 3) DAYS;
--
2015-03-15 00:00:00

示例3

从TIMESTAMP值中减去1毫秒(不支持微秒):

sql 复制代码
TIMESTAMP '2015-03-12 10:10:10.000' - 1 MICROSECOND; /* 被视为毫秒 */
--
2015-03-12 10:10:09.999

示例4

减去多个间隔字段:

sql 复制代码
TIMESTAMP '2015-03-12' - 1 DAY - 1 MICROSECOND;
--
2015-03-10 23:59:59

示例5

使用INTERVAL关键字:

sql 复制代码
date '2016-01-27' - interval '3' day;
--
2016-01-24

兼容性: IBM DB2、Oracle、Teradata

版本

  • INTERVAL关键字 - HPL/SQL 0.3.17
  • 引入 - HPL/HQL 0.3

Case表达式

CASE表达式允许在表达式中实现IF-THEN-ELSE逻辑。

语法

简单CASE表达式:

sql 复制代码
CASE 表达式
  WHEN 表达式 THEN 表达式
  ...
  [ELSE 表达式] 
END

搜索CASE表达式:

sql 复制代码
CASE 
  WHEN 布尔表达式 THEN 表达式
  ...
  [ELSE 表达式] 
END

注意

  • 如果没有匹配任何WHEN表达式且未指定ELSE子句,则返回NULL。

示例

简单CASE表达式:

sql 复制代码
 CASE state
   WHEN 'AZ' THEN '亚利桑那'
   WHEN 'CA' THEN '加利福尼亚'
   ELSE 'N/A'
 END 

搜索CASE表达式:

sql 复制代码
 CASE 
   WHEN state = 'AZ' THEN '亚利桑那'
   WHEN state = 'CA' THEN '加利福尼亚'
   ELSE 'N/A'
 END 

兼容性: Oracle、IBM DB2、SQL Server、Teradata、MySQL、PostgreSQL 和 Netezza。

版本: PL/HQL 0.01

Type属性

以下是转换成Markdown格式的%TYPE属性部分,并将描述语句翻译成中文:

%TYPE属性

%TYPE属性允许声明一个变量,该变量具有与指定的引用列相同的数据类型。

语法

sql 复制代码
var_name [schema.]table.column_name%TYPE
  • 如果//table.column_name//找不到,数据类型将从第一个赋值表达式中推导出来。

示例

sql 复制代码
DECLARE 
  i orders.item%TYPE;
BEGIN
  SELECT item INTO i FROM orders LIMIT 1;
  DBMS_OUTPUT.PUT_LINE('物品: ' || i);
END;

兼容性: Oracle

版本: HPL/SQL 0.3.13

RowType属性

以下是转换成Markdown格式的%ROWTYPE属性部分,并将描述语句翻译成中文:

%ROWTYPE属性

%ROWTYPE属性允许声明一个记录变量,该变量具有与指定数据库表相同的列和数据类型。

语法

sql 复制代码
var_name [schema.]table_name%ROWTYPE

示例

sql 复制代码
DECLARE 
  v orders%ROWTYPE;
BEGIN
  SELECT * INTO v FROM orders LIMIT 1;
  DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
END;
sql 复制代码
DECLARE 
  v orders%ROWTYPE;
  CURSOR c IS SELECT * FROM orders;
BEGIN
  OPEN c1;
  FETCH c1 INTO v1;
  DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
  CLOSE c1;
END;
sql 复制代码
BEGIN
  FOR v IN (SELECT * FROM orders)
  LOOP
    DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
  END LOOP;
END;
sql 复制代码
DECLARE
  v orders%ROWTYPE;
BEGIN
  EXECUTE IMMEDIATE 'SELECT * FROM orders LIMIT 1' INTO v;
  DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
END;

兼容性: Oracle

版本: HPL/SQL 0.3.13

游标属性

以下是转换成Markdown格式的游标属性部分,并将描述语句翻译成中文:

游标属性

游标属性允许您获取有关当前游标状态的信息。

语法

sql 复制代码
cursor_name%ISOPEN

cursor_name%FOUND

cursor_name%NOTFOUND
  • //cursor_name// 是已声明的游标或游标变量的名称。

===== %ISOPEN 属性 =====

%ISOPEN 如果游标是打开状态,则返回//true//,否则返回//false//。

===== %FOUND 属性 =====

%FOUND 在从游标获取数据之前返回NULL,在最后一次获取时返回//true//,否则返回//false//。

===== %NOTFOUND 属性 =====

%NOTFOUND 在从游标获取数据之前返回NULL,在最后一次获取时返回//false//,否则返回//true//。

示例

sql 复制代码
DECLARE 
  CURSOR c1 IS SELECT name FROM users LIMIT 1;
  v1 VARCHAR(30);
BEGIN
  OPEN c1;
  IF c1%ISOPEN THEN
    DBMS_OUTPUT.PUT_LINE('游标已打开');
  END IF; 
  
  FETCH c1 INTO v1;
  
  IF c1%FOUND THEN
    DBMS_OUTPUT.PUT_LINE('找到行');
  END IF;  
  
  FETCH c1 INTO v1;

  IF c1%NOTFOUND THEN
    DBMS_OUTPUT.PUT_LINE('未找到行');
  END IF;  

  CLOSE c1; 
END;

兼容性: Oracle

版本: HPL/SQL 0.3.11

相关推荐
武子康6 小时前
大数据-257 离线数仓 - 数据质量监控 监控方法 Griffin架构
java·大数据·数据仓库·hive·hadoop·后端
莹雨潇潇7 小时前
Hadoop完全分布式环境部署
大数据·hadoop·分布式
学计算机的睿智大学生12 小时前
Hadoop集群搭建
大数据·hadoop·分布式
清平乐的技术专栏1 天前
Hive SQL 查询所有函数
hive·hadoop·sql
节点。csn1 天前
Hadoop yarn安装
大数据·hadoop·分布式
不惑_1 天前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云
csding111 天前
写入hive metastore报问题Permission denied: user=hadoop,inode=“/user/hive”
数据仓库·hive·hadoop
NiNg_1_2341 天前
基于Hadoop的数据清洗
大数据·hadoop·分布式