• hive的语言元素


    参考文档地址

    http://www.hplsql.org/doc

    数据类型

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

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

    数据类型转换

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

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

    来源Hive SQL
    BITTINYINT
    DATETIMETIMESTAMP
    INT(n)INT
    INT2SMALLINT
    INT4INT
    INT8BIGINT
    NCHAR(n)STRING
    NVARCHAR(n)STRING
    NUMBER(p,s)DECIMAL(p,s)
    NUMERIC(p,s)DECIMAL(p,s)
    TEXTSTRING
    VARCHAR(MAX)STRING
    VARCHAR2(n)STRING

    语法声明

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

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

    DECLARE 块

    DECLARE 块具有以下语法:

    DECLARE 
      var 数据类型 [NOT NULL] [:= | = | 默认表达式];
      ...
    BEGIN
      ...
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    示例:

    DECLARE
      code CHAR(10);
      status INT := 1;
      count SMALLINT = 0;
      limit INT 默认 100;  
      max_limit 常量 INT := 1000;
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    DECLARE 语句

    DECLARE 语句具有以下语法:

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

    示例:

    DECLARE code CHAR(10);
    DECLARE status, status2 INT 默认 1;
    DECLARE count SMALLINT, limit INT 默认 100;  
    
    • 1
    • 2
    • 3

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

    赋值

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

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

    赋值运算符

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

    语法:

    var [:= | = ] 表达式;
    
    • 1

    示例:

    code := 'A';
    status := 1;
    count = 0;
    
    • 1
    • 2
    • 3

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

    版本: PL/HQL 0.01

    赋值语句

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

    语法:

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

    示例:

    SET code = 'A';
    SET status = 1, count = 0;
    SET (count, limit) = (0, 100);
    
    • 1
    • 2
    • 3

    兼容性: 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以来
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例:

    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';
    
    • 1
    • 2
    • 3

    兼容性: 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 
    
    • 1
    • 2
    • 3

    兼容性: 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语法
    
    • 1
    • 2
    • 3

    注意:

    • 小数部分是可选的

    兼容性: Oracle、IBM DB2

    版本: PL/HQL 0.03

    间隔表达式

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

    语法

    [INTERVAL] expression DAYS | DAY | MICROSECONDS | MICROSECOND
    
    • 1

    注意:

    • 由于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例3

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

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

    示例4

    减去多个间隔字段:

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

    示例5

    使用INTERVAL关键字:

    date '2016-01-27' - interval '3' day;
    --
    2016-01-24
    
    • 1
    • 2
    • 3

    兼容性: 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    搜索CASE表达式:

    CASE 
      WHEN 布尔表达式 THEN 表达式
      ...
      [ELSE 表达式] 
    END
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意

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

    示例

    简单CASE表达式:

     CASE state
       WHEN 'AZ' THEN '亚利桑那'
       WHEN 'CA' THEN '加利福尼亚'
       ELSE 'N/A'
     END 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    搜索CASE表达式:

     CASE 
       WHEN state = 'AZ' THEN '亚利桑那'
       WHEN state = 'CA' THEN '加利福尼亚'
       ELSE 'N/A'
     END 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    兼容性: 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
    
    • 1
    • 如果//table.column_name//找不到,数据类型将从第一个赋值表达式中推导出来。

    示例

    DECLARE 
      i orders.item%TYPE;
    BEGIN
      SELECT item INTO i FROM orders LIMIT 1;
      DBMS_OUTPUT.PUT_LINE('物品: ' || i);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    兼容性: Oracle

    版本: HPL/SQL 0.3.13

    RowType属性

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

    %ROWTYPE属性

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

    语法

    var_name [schema.]table_name%ROWTYPE
    
    • 1

    示例

    DECLARE 
      v orders%ROWTYPE;
    BEGIN
      SELECT * INTO v FROM orders LIMIT 1;
      DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    BEGIN
      FOR v IN (SELECT * FROM orders)
      LOOP
        DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
      END LOOP;
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    DECLARE
      v orders%ROWTYPE;
    BEGIN
      EXECUTE IMMEDIATE 'SELECT * FROM orders LIMIT 1' INTO v;
      DBMS_OUTPUT.PUT_LINE('物品: ' || v.name || ' - ' || v.description);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    兼容性: Oracle

    版本: HPL/SQL 0.3.13

    游标属性

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

    游标属性

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

    语法

    cursor_name%ISOPEN
    
    cursor_name%FOUND
    
    cursor_name%NOTFOUND
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • //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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    兼容性: Oracle

    版本: HPL/SQL 0.3.11

  • 相关阅读:
    云游戏| 云计算推动游戏行业进入“新纪元”
    Kotlin高仿微信-第36篇-支付-设置金额
    C++ 基础入门 之 程序流程结构-选择结构if三目switch/循环结构while/dowhile/for/跳转结构break/continue/goto
    C++日期和时间编程小结
    python requests请求一个api接口报错
    加密后的敏感字段还能进行模糊查询吗?该如何实现?
    Java核心篇,二十三种设计模式(二十二),行为型——模板方法
    题目:Java 程序员的 10 道 XML 面试题
    java计算机毕业设计剧院售票系统源码+mysql数据库+系统+lw文档+部署
    关于linux与android传输代码tcp -传文件
  • 原文地址:https://blog.csdn.net/xielinrui123/article/details/132775666