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

相关推荐
Q26433650231 小时前
【有源码】基于文本挖掘的消费者金融投诉主题发现与风险预警研究,基于Python的CFPB消费者投诉数据可视化分析系统
大数据·hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计
国产化嵌入式平台解决方案4 小时前
从通用计算到实时协同:基于飞腾D3000M+FPGA的国产VPX计算平台设计
fpga开发·硬件架构·vpx6u
Q26433650235 小时前
【有源码】基于机器学习的商场商铺运营分群与可视化分析研究 基于Spark的商场商铺经营效率分析与可视化
大数据·hadoop·机器学习·数据挖掘·数据分析·spark·毕业设计
Gl�ria5 小时前
Hadoop MapReduce / Hive 场景:ReduceTask 热点 Key 排查
运维·hadoop·数据倾斜
Q26433650231 天前
【有源码】基于机器学习的电信网络诈骗话术语义识别与可视化分析系统 XGBoost算法+Hadoop+Spark
大数据·hadoop·算法·机器学习·spark·毕业设计·课程设计
Q26433650231 天前
【有源码】基于 Hadoop 的强化学习智能体轨迹数据挖掘与可视化分析系统大数据毕设项目
大数据·hadoop·机器学习·数据挖掘·spark·课程设计·数据可视化
Q26433650231 天前
【有源码】基于大数据的药品多维度属性分析可视化系统 基于Spark的药品属性聚类与关联规则可视化分析系统
hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计·大数据项目
网络豆1 天前
Apache Hive 鸿蒙 PC 适配全记录:以 Qt 客户端打通 HiveQL、监控与元数据访问
hive·apache·harmonyos
Q26433650231 天前
【有源码】基于大数据的零售交易者行为特征与生存状况数据分析及可视化 Hadoop+Spark大数据项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·spark·毕业设计
Q26433650231 天前
【有源码】基于 Hadoop 生态的化妆品销售数据存储分析与可视化 面向化妆品行业的用户画像构建与销售机会识别研究
大数据·hadoop·python·机器学习·spark·毕业设计·课程设计