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 块具有以下语法:

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

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

  var 常量 数据类型 := | 默认表达式

示例:

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 语句具有以下语法:

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

示例:

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中为变量设置新值。

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

赋值运算符

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

语法:

var [:= | = ] 表达式;

示例:

code := 'A';
status := 1;
count = 0;

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

版本: PL/HQL 0.01

赋值语句

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

语法:

SET var = 表达式 [, ...];
|
SET (var [, var2, ...]) = (表达式 [, 表达式2, ...])

示例:

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 语句从查询结果的第一行赋值:

语法:

SET var = (SELECTFROM ...);
|
SET (var [, var2, ...]) = (SELECT[,2, ... ] FROM ...);
|
SELECT var =[, var2 =2, ...] FROM ...  -- 自HPL/SQL 0.3.11以来

示例:

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数据类型的表达式中使用这个日期值。

示例

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数据类型的表达式中使用这个时间戳值。

示例

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值中减去。

语法

[INTERVAL] expression DAYS | DAY | MICROSECONDS | MICROSECOND

注意:

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

示例1

将1天添加到DATE和TIMESTAMP值:

DATE '2015-03-12' + 1 DAY;
--
2015-03-13

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

示例2

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

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毫秒(不支持微秒):

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

示例4

减去多个间隔字段:

TIMESTAMP '2015-03-12' - 1 DAY - 1 MICROSECOND;
--
2015-03-10 23:59:59

示例5

使用INTERVAL关键字:

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表达式:

CASE 表达式
  WHEN 表达式 THEN 表达式
  ...
  [ELSE 表达式] 
END

搜索CASE表达式:

CASE 
  WHEN 布尔表达式 THEN 表达式
  ...
  [ELSE 表达式] 
END

注意

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

示例

简单CASE表达式:

 CASE state
   WHEN 'AZ' THEN '亚利桑那'
   WHEN 'CA' THEN '加利福尼亚'
   ELSE 'N/A'
 END 

搜索CASE表达式:

 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属性允许声明一个变量,该变量具有与指定的引用列相同的数据类型。

语法

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

示例

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属性允许声明一个记录变量,该变量具有与指定数据库表相同的列和数据类型。

语法

var_name [schema.]table_name%ROWTYPE

示例

DECLARE 
  v orders%ROWTYPE;
BEGIN
  SELECT * INTO v FROM orders LIMIT 1;
  DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
END;
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;
BEGIN
  FOR v IN (SELECT * FROM orders)
  LOOP
    DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
  END LOOP;
END;
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格式的游标属性部分,并将描述语句翻译成中文:

游标属性

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

语法

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//。

示例

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

你可能感兴趣的:(大数据开发,hive,hive,硬件架构,hadoop)