inceptor和sql的交互(db2方言)

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语句的字符串常量。

上一篇:DB2常用修改表结构SQL语句


下一篇:如何将IBM DB2的递归增量转换为MySQL版本?