IF判断的存储过程

逐个表查询数据,查询到数据就直接返回。
如下例子:

依次从 table1、table2、table3 三个表中查询数据,resultCount 默认值为0,把每次查询结果的行数复制给 resultCount,根据条件 IF @resultCount=0 THEN终止还是继续。
临时表主要用来过渡数据,返回查询结果

执行SQL

DELIMITER //
drop procedure if exists p_bovms_bills_get_vouchermessage;
CREATE DEFINER = `peng`@`%` PROCEDURE `p_bovms_bills_get_vouchermessage`(_ent_id bigint, _pzId varchar(80))
BEGIN
/*-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
功能描述: 
详细描述:
参数说明:

创建时间:2018-02-09, peng
最后修改时间:2018-02-09, peng
修改说明:
调用例子:
call p_bovms_bills_get_vouchermessage(1, "f0441e0f-e2f2-4509-84cd-06dde59b4cd5");
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
    set @ent_id = _ent_id,@pzId = _pzId;
    set @resultCount = 0;
  create TEMPORARY table if not exists temp_resultCount(
    ent_id bigint
        ,bill_type_id int(11)
    ,vt_num_list varchar(100)
    ,vch_id_list varchar(500)
  )ENGINE=myisam;

IF @resultCount=0 THEN
  insert into temp_resultCount(ent_id,bill_type_id,vt_num_list,vch_id_list)
    SELECT ent_id,bill_type_id,vt_num_list,vch_id_list FROM
        table1
    WHERE vm_state = "2" AND ent_id = @ent_id AND vch_id_list LIKE CONCAT('%',@pzId,'%');
  select count(1) into @resultCount from temp_resultCount;
END IF;

IF @resultCount=0 THEN
  insert into temp_resultCount(ent_id,bill_type_id,vt_num_list,vch_id_list)
    SELECT ent_id,bill_type_id,vt_num_list,vch_id_list FROM
        table2 
    WHERE vm_state = "2" AND ent_id = @ent_id AND vch_id_list LIKE CONCAT('%',@pzId,'%');
  select count(1) into @resultCount from temp_resultCount;
END IF;

IF @resultCount=0 THEN
  insert into temp_resultCount(ent_id,bill_type_id,vt_num_list,vch_id_list)
    SELECT ent_id,bill_type_id,vt_num_list,vch_id_list FROM
        table3 
    WHERE vm_state = "2" AND ent_id = @ent_id AND vch_id_list LIKE CONCAT('%',@pzId,'%');
  select count(1) into @resultCount from temp_resultCount;
END IF;

  select * from temp_resultCount;
  drop TEMPORARY table if exists temp_resultCount; 
END
//
DELIMITER ;

${param}传递的参数会被当成sql语句中的一部分,比如传递表名,字段名
#{parm}传入的数据都当成一个字符串,会对自动传入的数据加一个双引号

<update id="updateVoucherPzZh">
    UPDATE ${tableName}
    SET vt_num_list = #{vt_num_list}
    WHERE
        vm_state = "2"
    AND ent_id = #{ent_id}
    AND vch_id_list = #{vch_id_list};
</update>
<think>我们正在讨论的是Hive存储过程中的IF判断语法。但需要注意的是,Hive本身并不支持存储过程(类似于Oracle或MySQL的存储过程)。Hive主要是通过HiveQL(类SQL语言)进行数据查询和转换,而复杂的流程控制通常通过外部脚本(如Shell、Python)或结合HPL/SQL(Hive Procedure Language SQL,一种扩展)来实现。 然而,根据用户的问题,他可能指的是在Hive查询中使用的IF函数,或者是在Hive的脚本中(如Hive的hplsql扩展)使用IF条件控制。由于Hive原生不支持存储过程,我将从两个角度回答: 1. **Hive查询中IF函数的使用**(之前已经讨论过,但用户这次明确提到“存储过程”,所以需要澄清) 2. **Hive的HPL/SQL扩展中的IF语句**(如果用户指的是类似存储过程的控制流) ### 1. Hive查询中的IF函数 在Hive查询中,IF函数用于条件表达式,语法为: ```sql IF(condition, value_if_true, value_if_false) ``` 例如: ```sql SELECT IF(1>2, 'true', 'false'); -- 返回 'false' ``` 这在之前的回答中已经详细说明。 ### 2. Hive的HPL/SQL扩展(存储过程) Hive从Hive 2.0开始引入了HPL/SQL,它支持存储过程,包括条件控制(如IF语句)。HPL/SQL的语法类似于Oracle的PL/SQL。以下是HPL/SQL中IF语句的用法: #### 基本语法 ```plsql IF condition THEN statements; ELSEIF condition THEN statements; ELSE statements; END IF; ``` #### 示例 ```plsql CREATE PROCEDURE example_procedure(IN x INT) BEGIN IF x > 10 THEN PRINT 'x is greater than 10'; ELSEIF x = 10 THEN PRINT 'x is 10'; ELSE PRINT 'x is less than 10'; END IF; END; ``` #### 调用存储过程 ```plsql CALL example_procedure(5); ``` ### 3. 在Hive命令行或脚本中使用IF控制流 如果用户指的是在运行Hive查询时使用条件控制(如Shell脚本中调用Hive),那么可以使用Shell的IF语句来控制Hive查询的执行。例如: ```bash #!/bin/bash if [ $1 -gt 10 ]; then hive -e "SELECT * FROM table1;" else hive -e "SELECT * FROM table2;" fi ``` ### 总结 - **Hive查询中**:使用`IF(condition, true_value, false_value)`函数,适用于单个条件表达式。 - **HPL/SQL存储过程**:使用`IF ... THEN ... ELSEIF ... ELSE ... END IF;`结构,适用于编写存储过程。 - **外部脚本**:在调用Hive的脚本(如Shell)中使用脚本语言的IF语句。 ### 注意事项 - HPL/SQL需要单独安装和配置,并且可能不是所有Hive环境都支持。 - 在编写HPL/SQL存储过程时,需要先创建存储过程,然后调用。 ### 示例:HPL/SQL中的IF语句 以下是一个完整的HPL/SQL存储过程示例,其中包含IF判断: ```plsql -- 创建存储过程 CREATE PROCEDURE check_value(IN val INT) BEGIN IF val > 100 THEN INSERT INTO result_table VALUES (val, 'High'); ELSEIF val > 50 THEN INSERT INTO result_table VALUES (val, 'Medium'); ELSE INSERT INTO result_table VALUES (val, 'Low'); END IF; END; -- 调用存储过程 CALL check_value(75); ``` ### 如何运行HPL/SQL 1. 确保安装了HPL/SQL(下载hplsql的jar包并配置)。 2. 使用命令行运行:`hplsql -f your_procedure.hplsql`。 ### 参考 - [HPL/SQL官方文档](http://www.hplsql.org/doc) 请根据您的实际环境选择合适的方法。如果您的Hive环境不支持HPL/SQL,那么建议使用外部脚本控制流程。 §§相关问题§§ 1. Hive中如何创建和使用存储过程? 2. HPL/SQL与标准HiveQL有什么区别? 3. 在Shell脚本中如何根据条件执行不同的Hive查询? 4. Hive中除了IF函数还有哪些条件函数?</think>### Hive 存储过程 IF 判断语法详解 在 Hive 中,"存储过程"通常指通过 **HPL/SQL** (Hive Procedural Language SQL) 实现的存储功能,它是 Hive 2.0+ 引入的扩展功能。HPL/SQL 支持完整的流程控制语句,包括 IF 判断。以下是语法和示例: #### 1. **基本语法** ```sql IF condition THEN statements; [ELSEIF condition THEN statements;] [ELSE statements;] END IF; ``` #### 2. **关键特性** - **条件表达式**:支持所有 Hive 布尔表达式(如 `col > 10`, `status = 'active'`) - **运算符**:`=` 或 `==` 均可表示等于(引用[3]验证) - **嵌套支持**:可多层嵌套 IF 语句(引用[3]示例) - **变量支持**:需使用 `DECLARE` 声明变量 #### 3. **完整示例** ```sql -- 创建存储过程 CREATE PROCEDURE check_sales(IN sales_amount INT) BEGIN DECLARE sales_level STRING; -- IF 判断逻辑 IF sales_amount > 1000 THEN SET sales_level = 'High'; ELSEIF sales_amount >= 500 THEN SET sales_level = 'Medium'; ELSE SET sales_level = 'Low'; END IF; -- 输出结果 PRINT 'Sales Level: ' || sales_level; END; -- 调用存储过程 CALL check_sales(1200); -- 输出: Sales Level: High CALL check_sales(300); -- 输出: Sales Level: Low ``` #### 4. **嵌套 IF 示例** (引用[3]语法验证) ```sql CREATE PROCEDURE nested_if_example(IN a INT, IN b INT) BEGIN IF a = b THEN IF a > 10 THEN PRINT 'Both equal and >10'; ELSE PRINT 'Equal but <=10'; END IF; ELSE PRINT 'Not equal'; END IF; END; -- 测试调用 CALL nested_if_example(5,5); -- 输出: Equal but <=10 CALL nested_if_example(15,15); -- 输出: Both equal and >10 ``` #### 5. **实际应用场景** 结合表操作的完整示例: ```sql CREATE PROCEDURE update_order_status(IN order_id STRING) BEGIN DECLARE order_value DOUBLE; -- 获取订单金额 SELECT amount INTO order_value FROM orders WHERE id = order_id; -- IF 条件更新 IF order_value > 1000 THEN UPDATE orders SET status = 'VIP' WHERE id = order_id; ELSEIF order_value > 500 THEN UPDATE orders SET status = 'Standard' WHERE id = order_id; ELSE UPDATE orders SET status = 'Basic' WHERE id = order_id; END IF; END; ``` ### 注意事项 1. **环境要求**:需启用 HPL/SQL(Hive 2.0+ 默认支持) 2. **执行方式**: ```bash hplsql -f procedure.hplsql # 执行存储过程文件 ``` 3. **调试技巧**:使用 `PRINT` 语句输出中间变量 4. **运算符注意**:`<>` 表示不等于(引用[3]验证) > 在 Hive 查询中(非存储过程),可直接用 `IF()` 函数: > `SELECT IF(amount>1000,'High','Low') FROM sales;`(引用[1][2])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值