inceptor和sql的交互(db2方言)
一、将select的返回值赋值给变量
1.1将查询的结果赋值给变量
!set plsqlUseSlash true
BEGIN
DECLARE V1 STRING;
DECLARE V2 DOUBLE;
-- 查询transactions表中价格为11.11的交易时间,并赋值给变量V1。
SET V1 = (SELECT trans_time FROM transactions WHERE price = 11.11);
-- 查询transactions表中交易号为162742112的价格,并赋值给变量V2。
SET V2 = (SELECT price FROM transactions WHERE trans_id=162742112);
PUT_LINE('V1:'||V1);
PUT_LINE('V2:'||V2);
END;
/
输出结果为:
output
V1:20140205140521
V2:12.21
二、 SELECT INTO
通过select into语句将行值赋给行变量
!set plsqlUseSlash true
BEGIN
-- 定义一个行数据类型transactiontype,包含了三个字段v_acc_num , v_trans_time , v_price,其中字段v_acc_num的数据类型为STRING,v_trans_time的数据类型为STRING,v_price的数据类型为DOUBLE。
DECLARE TYPE transactiontype AS ROW (v_acc_num STRING, v_trans_time STRING, v_price DOUBLE);
-- 声明一个行变量transactionrow,其数据类型为transactiontype,该变量包含transactiontype类型的三个字段。
DECLARE transactionrow transactiontype;
-- 通过SELECT INTO语句将表transactions中股票账号为GL2547626的账号,交易时间和价格放进行变量transactionrow中。
SELECT acc_num,trans_time,price INTO transactionrow FROM transactions WHERE stock_id='GL2547626';
-- 打印出行变量transactionrow中的字段transactionrow.v_acc_num的值。
PUT_LINE('acc_num:'||transactionrow.v_acc_num);
-- 打印出行变量transactionrow中的字段transactionrow.v_trans_time的值。
PUT_LINE('time:'||transactionrow.v_trans_time);
-- 打印出行变量transactionrow中的字段transactionrow.v_price的值。
PUT_LINE('price:'||transactionrow.v_price);
END;
/
输出结果为:
output
acc_num:5224133
time:20140801110003
price:6.36
三、存储过程和sql的交互
inceptor中可以利用创建存储过程,对表进行增删该查等操作,将DML,update,insert,merge等语句,写进存储当中就可以,调用存储的时候,批量执行DML语句了
3.1在存储中执行update,insert,merge等语句
-- 调用过程sql_procedure,实参的值分别为zhangsan,4.5。
!set plsqlUseSlash true
-- 创建名为sql_procedure的存储过程,参数类型均为IN类型,其中形参v_name的数据类型为STRING,形参v_gpa的数据类型为DOUBLE。
CREATE OR REPLACE PROCEDURE sql_procedure(IN v_name STRING,IN v_gpa DOUBLE)
BEGIN
-- 往表zara中插入一条数据,姓名为Amy,年龄为23,绩点为4.5。
INSERT INTO zara VALUES('Amy',23,4.5);
-- 将表zara中姓名和参数v_name相等的人的年龄更新为18。
UPDATE zara SET age= 18 WHERE name = v_name;
-- 删除表zara中绩点与参数v_gpa的值相等的记录。
DELETE FROM zara WHERE gpa = v_gpa;
-- 对表za进行merge操作,条件为两个表中的姓名相同。
MERGE INTO za z using zara r on (z.name=r.name)
-- 如果条件匹配,即两个表中存在姓名相同的记录,就将表za中姓名和表zara中姓名相同的人的年龄更新为40。
WHEN MATCHED THEN UPDATE SET z.age=40
-- 如果条件不匹配,就将表zara中与表za中姓名不相同的姓名和对应的年龄插入到表za中。
WHEN NOT MATCHED THEN INSERT (name,age) VALUES(r.name,r.age);
END;
/
CALL sql_procedure('zhangsan',4.5);
四、函数与SQL的交互
与存储过程类似,在Inceptor中也可以将UPDATE,INSERT,DELETE,MERGE等DML语句,放进函数里,在调用函数时,执行函数内的SQL语句。
在函数内执行UPDATE,INSERT,DELETE,MERGE等DML语句
!set plsqlUseSlash true
-- 创建一个名为sql_function的函数,参数的类型为IN类型,参数的数据类型为STRING。
CREATE OR REPLACE FUNCTION sql_function(IN v_name STRING)
-- sql_function函数的返回值的数据类型为DOUBLE。
RETURNS DOUBLE
BEGIN
DECLARE v_gpa DOUBLE;
-- 查询表zara中姓名和参数相等的人的绩点,并放进一个DOUBLE类型的变量v_gpa里。
SELECT gpa INTO v_gpa FROM zara WHERE name=v_name;
-- 函数返回值为v_gpa的值。
RETURN v_gpa;
END;
/
BEGIN
-- 在一个语句块内执行DML语句DELETE,删除表zara中绩点与sql_function('lily')返回值相等的记录。
DELETE FROM zara WHERE gpa= sql_function('lily');
END;
/
五、游标
在Inceptor中可以通过游标查询数据,与SQL进行交互。游标相关的用法请查看其他笔记
!set plsqlUseSlash true
BEGIN
-- 声明一个名为c1的游标,用来查找表transactions中价格为12.13的交易时间。
DECLARE c1 CURSOR FOR SELECT trans_time FROM transactions WHERE price=12.13;
-- 声明一个名为v_time的变量,数据类型为字符串。
DECLARE v_time STRING;
-- 打开游标。
OPEN c1;
-- 将游标查询到的结果放进变量v_time里。
FETCH c1 INTO v_time;
-- 关闭游标。
CLOSE c1;
-- 打印出变量v_time的值。
PUT_LINE('the time is:'||v_time);
END;
/
六、动态sql
6.1 EXECUTE IMMEDIATE
-
Dynamic SQL中最常使用EXECUTE IMMEDIATE语句来执行动态SQL语句,使用EXECUTE
IMMEDIATE语句可以创建执行DDL语句,DCL语句,DML语句以及单行的SELECT 语句,但该方法不能用于处理多行查询语句。 -
在具体的使用过程中,是将相应的DDL语句,DCL语句,DML语句以及单行的SELECT 语句等SQL语句,放进一个已声明的字符串变量中,再用EXECUTE IMMEDIATE去执行该字符串变量,或者EXECUTE IMMEDIATE关键字后直接跟含有SQL语句的字符串常量。