HANA 存储过程 基础篇

第一次写博客,要是写的不好 请大家多多见谅!下面是我学习hana 存储过程时的一些总结 希望能与大家探讨一番 

如果有错误的 希望各位能指出 我会修订好的

1. table_type

1.1 自定义table_type 
Synatx:
CREATE TYPE <type_name> AS TABLE (<column_definition>[{,<column_definition>}...])
 Example:
      CREATE TYPE tt_publishers AS TABLE (
publisher INTEGER,
name VARCHAR(50),
price DECIMAL,
cnt INTEGER);
1.2 删除table_type
 Synatx:
   DROP TYPE <type_name> [<drop_option>]  
         当drop_option没有被指定,将执行无级联删除。这只会删除指定内容的类型,依赖对象只会失效而不会被删除。当创建相同的模式和对象的名称时,可以使失效的依赖对象重新有效。
  Example:
CREATE TYPE my_type AS TABLE ( column_a DOUBLE );
DROP TYPE my_type;
2. Procedure
2.1 与纯粹的sql语句相比 存储过程的性能优于前者。并且存储过程简化了查询常见子表达式的步骤,并且提高了SQLScript的可读性。
2.2 “:”后面跟着的是变量 例如:A  说明A是一个变量
2.3 创建存储过程
Synatx:
CREATE PROCEDURE <proc_name> [(<parameter_clause>)] [LANGUAGE <lang>] [SQLSECURITY <mode>] [DEFAULT SCHEMA <default_schema_name>]
[READS SQL DATA [WITH RESULT VIEW <view_name>]] AS
BEGIN [SEQUENTIAL EXECUTION]
<procedure_body>
END


READS SQL DATA可以用于优化。
Example:
One:使用了游标的存储过程
CREATE PROCEDURE orchestrationProc
LANGUAGE SQLSCRIPT AS
BEGIN
DECLARE v_id BIGINT;
DECLARE v_name VARCHAR(30);
DECLARE v_pmnt BIGINT;
DECLARE v_msg VARCHAR(200);
DECLARE CURSOR c_cursor1 (p_payment BIGINT) FOR
SELECT id, name, payment FROM control_tab
WHERE payment > :p_payment ORDER BY id ASC;
CALL init_proc();
OPEN c_cursor1(250000);
FETCH c_cursor1 INTO v_id, v_name, v_pmnt; v_msg := :v_name || ' (id ' || :v_id|| ') earns ' || :v_pmnt || ' $.'; 
----此处 | | 是字符串的拼接 拼接完成后 赋值给v_msg 然后在下面的ins_msg_proc当做参数
CALL ins_msg_proc(:v_msg);
CLOSE c_cursor1;
END;


Two:只读型存储过程
CREATE PROCEDURE ProcWithResultView(IN id INT, OUT o1 CUSTOMER)
LANGUAGE SQLSCRIPT
READS SQL DATA WITH RESULT VIEW ProcView AS
BEGIN
o1 = SELECT * FROM CUSTOMER WHERE CUST_ID = :id;
END;


2.4 删除存储过程
 Synatx:
DROP PROCEDURE <proc_name> [<drop_option>]
跟删除表类型一样,当drop_option没有被指定,将执行无级联删除。这只会删除指定内容的类型,依赖对象只会失效而不会被删除。当创建相同的模式和对象的名称时,可以使失效的依赖对象重新有效。
Example:
DROP PROCEDURE my_proc;
2.5 修改存储过程
 Synatx:
  ALTER PROCEDURE <proc_name> RECOMPILE [WITH PLAN]
Example:
ALTER PROCEDURE my_proc RECOMPILE WITH PLAN;
    建议:一般项目中对存储过程进修改的话 是对其drop 然后在create 然后在create中修改相应的部位
2.6 使用存储过程
 Synatx:
  CALL <proc_name> (<param_list>) [WITH OVERVIEW]
   给存储过程传递参数(参数为标量、常量) 可以通过IN、OUT、INOUT。
  WITH OVERVIEW ---存储过程调用的结果将直接存储到一张物理表中。
 Example:
  在调试模式中调用存储过程
   CALL getOutput (1000, 'EUR', NULL, NULL) IN DEBUG MODE;
  使用带有预览选项的方法调用存储过程
   CALL getOutput(1000, 'EUR', ot_publishers, NULL) WITH OVERVIEW;
2.7 内部存储过程调用
Note(注意):请注意在标识符前面使用”:”。
Synatx:
CALL <proc_name > (<param_list>)
Example:
CALL  addDiscount (:lt_expensive_books, lt_on_sale);
addDiscount这个存储过程是个内部存储过程
:lt_expensive_books 是外部存储过程的变量 但是因为有“:”代表对其取值,所以将其作为输入参数传入。 lt_on_sale也是外部存储过程的变量但是没有“:”代表没有对它取值,所以作为输出参数传出
2.8 调用存储过程命名参数(通过令牌 =>)
 Example:
  CALL myproc (i => 2) 
  Complete Example:
           DROP TYPE mytab_t
drop table mytab
drop procedure myproc


create type mytab_t as table (i int);


create table mytab (i int);
insert into mytab values (0);
insert into mytab values (1);
insert into mytab values (2);
insert into mytab values (3);
insert into mytab values (4);
insert into mytab values (5);


create procedure myproc (in intab mytab_t,in i int, out outtab mytab_t) as
begin
outtab = select i from :intab where i > :i;
end;
          :i指的是存储过程中的参数i 而前者i指的是intab表类型中的i
call myproc(intab=>mytab, i=>2, outtab =>?);
2.9 存储过程参数格式类型
     IN:输入参数
     OUT:输出参数
     INOUT:既可以将数据传入 也可以将数据输出
2.10 为参数设定系统默认值(default)
    Example:
CREATE PROCEDURE MYPROC(IN P1 INT, IN P2 INT DEFAULT 1, OUT out1 DUMMY) AS
BEGIN
out1 = SELECT :P1 + :P2 AS DUMMY FROM DUMMY;
END;
Note:使用 => 赋值使用
Example:
CALL MYPROC(3, 4,?);
Or
CALL MYPROC(P1 => 3, out1 => ?)
2.11 用户自定义功能概念(只读模式 所以安全性好)
One:table function
  输入参数数据类型:表类型和原始数据类型
  输出参数数据类型:返回一张在<return type>中定义过类型的表
 默认情况下,该函数被标记为只读模式
Two:scalar function
  输入参数数据类型:原始数据类型
输出参数数据类型:必须返回在<return_parameter_list>中指定的标量的值
默认情况下,该函数被标记为只读模式
2.12 创建自定义功能
     Synatx:
      CREATE FUNCTION <func_name> [(<parameter_clause>)] RETURNS <return_type> [LANGUAGE<lang>] [SQL SECURITY <mode>]
       AS
       BEGIN
       <function_body>
       END
Example:
 
2.13 删除自定义功能
     Synatx:
      DROP FUNCTION <func_name> [<drop_option>]
Note:<drop_option> ::= CASCADE | RESTRICT
如果<drop_option>定义为 CASCADE 删除function的同时还会删除依赖对象
如果<drop_option>定义为RESTRICT 只能在无依赖对象的时候使用 如果存在依赖对象 还定义RESTRICT 则会抛出错误
      Example:
        DROP FUNCTION my_func;
2.14 不支持的SQL函数
目前在SQLScript过程和用户定义函数中不支持一下SQL函数
  
3. 声明SQLScript逻辑
3.1  
Note:从过程中产生的存储过程和结果视图不连接在安全透视图中,因此不继承彼此的特权。每个对象的安全方面必须单独处理。例如,您应该在一个结果视图中授予SELECT特权,并在一个连接的存储过程中执行特权。
3.2 表变量
表变量是具有表类型的变量,也就是说它们与物理表、SQL查询或计算引擎计划操作符的值绑定在一起。表变量也可以用于像in或OUT变量这样的过程的签名。当一个存储过程被调用时,一个表变量绑定到列表值,而在参数上的列表是绑定到它的参数值的。另一种选择是在一个存储过程的主体中,当一个表表达式被绑定到一个使用赋值的变量时。在输入和输出参数时必须显式地输入,在存储过程中,一个程序的主体的表变量的类型来自于它们绑定到存储过程的编译时的表达式
3.3 表变量的绑定
表变量的使用相当于绑定运算符操作,且由于中间结果赋值或调用其他函数所导致的循环依赖关系是不允许的,也就表明递归是不存在的
3.4 引用变量
Note:在优化的过程中,未使用结果的语句将会被删除。
3.5 列视图参数绑定 
 Synatx:
  SELECT * FROM <column_view> ( <named_parameter_list> );
使用列视图参数绑定 可以将参数从存储过程/脚本计算视图传递到参数化列视图中
Example1:
 
Example2:
 
方法使用:
 
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值