hive的语言元素
  tU95LmXaBSF2 2023年11月02日 43 0


参考文档地址

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 = (SELECT 列 FROM ...);
|
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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
tU95LmXaBSF2