大家好,
今天我在这里快速向大家展示一种有用的技术,它可以像在ABAP中一样在SQLScript中生成循环(基于索引的单元访问)。对于那些"HANA初学者"和从/到有困难的人,我想说的是,平销返利,在大多数情况下,数据量很小,这将是很好的,主要是对于那些你需要在和/或其他少数情况下创建寄存器…
请记住,这种技术对大量数据的性能有不良影响,应作为一个例外,并在特定情况下使用的DML/DQL不是够了…
尽可能把你的逻辑放在DQL/DML语句上,因为HANA有以最佳方式处理数据的引擎,而且要快得多…
最初,对于最常见的循环方式,我很难在简单的文本中找到替代方法:光标和带偏移量的选择。
让我们开始:
假设我们有一个工资表,我们想给10年或10年以上雇佣的员工加薪20%,10%的员工是10年前雇佣的…下表显示:
如果我们正在开发一个ABAP,数据分析工具有哪些,我会这样做(我假设这个表已经创建并填充):
我们如何将上面的代码转换成HANA SQLScript过程?
使用匿名块,我们可以直接将一个SQLSCript编码到HANA的SQL控制台中…
重要说明:下面的所有代码都是用1.0版SPS12(1.00.122.15.1516128271)编写的
从HANA 2.0版SPS00开始,而不是这样:
您可以使用operator RECORD\u COUNT,为了以更新和现代的方式完成同样的"老派"任务:
另一个重要的说明是,代码中有些地方您将无法直接使用基于索引的单元格访问,例如WHERE子句等。对于这些场景,您可以将表格单元格分配给一个变量,然后在需要时使用该变量。
执行上述代码后,结果如下:
谢谢,下一篇文章再见!
另请注意,如果您希望在SAP HANA中复制上述测试,物联网是学什么的,以下是一些代码,以使操作更简单,以防万一?
*******************************SQL DDL/DML**********************************
创建表"S0003358391"("ID"整数CS\u INT,"名称"NVARCHAR(30),"部门"NVARCHAR(30),"雇用日期"日期,"工资"小数点(15,2),主键("ID"))卸载优先级5自动合并
插入"S0003358391."PAYROLL"值(1,'JOHN',物联网断路器,'SALES','20170101',10000);在"S0003358391"中插入"PAYROLL"值(2,'LEONARDO','SALES','19700101',50000);在"S0003358391"中插入"PAYROLL"值(3,'WILLIAM','IT','19800101',5000);在"S0003358391"中插入"PAYROLL"值(4,'ALLAN','IT','19900101',45000);在"S0003358391"中插入"PAYROLL"值(5,'FABIO','IT','20000101',30000);在"S0003358391"中插入"工资单"值(6,'MARCELO','MARKETING','20150101',45000);在"S0003358391"中插入"工资单"值(7,'ANDRE','MARKETING','20150101',35000);在"S0003358391"中插入"工资单"值(8,'VIVIAN','RH','20140101',30000);在"S0003358391"中插入"PAYROLL"值(9,企业软件正版化,'PAULA','RH','20140101',30000);在"s003358391"中插入"PAYROLL"值(10,'MACIEL','IT','20180101',30000);
您可以将架构"s003358391"替换为与您的用户或您的任何首选项对应的架构
***************************************SQLSCRIPT CODE***************************DO
BEGIN
declare v\u years integer;
declare v\u count integer;
声明v\u i整数;
sel1=select*from"s003358391"."PAYROLL"order by hire\u date;
select count(*)into v\u count from:sel1;
for v\u i in 1..v\u count do
if(months\u between(:sel1.hire\u date[v\u i],to\u date(now())/12)>=10然后
sel1.salary[v\u i]=:sel1.salary[v\u i]+(:sel1.salary[v\u i]*0.2);
else
sel1.salary[v_i]=:sel1.salary[v_i]+(:sel1.salary[v_i]*0.1);
end if;
end for;
upsert"S0003358391"."PAYROLL"select*from:sel1;