如何在DB2中的存储过程中使用输入变量

时间:2018-04-17 19:17:04

标签: db2 db2-luw

我正在创建一个存储过程,它接受一个输入变量并在动态SQL查询中进行一些比较。但是没有拾取变量,我如何在这里使用变量。这是我的SP的样子

CREATE OR REPLACE PROCEDURE SP1(
IN start_date VARCHAR(20))

DYNAMIC RESULT SETS 1
P1: BEGIN

DECLARE SQLCODE integer;
DECLARE table_exists integer default 0;
DECLARE myQuery VARCHAR(2000);

SET myQuery = "CREATE TABLE XYZ AS(SELECT * FROM TABLE WHERE date > "+ start_date + ") WITH DATA"

execute immediate(myQuery)
END P1 

----------已经修改---------------

我的CREATE STATEMENT实际上比我在这里写的更长,我需要一个长的VARCHAR变量myquery,但是我收到一个错误

``is too long.  The maximum length is "128"..``

我该怎么办?

我需要做些什么改变才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

您无法使用" +"在Db2的叮咬。使用||。你也错过了一些分号。这段代码为我运行

CREATE OR REPLACE PROCEDURE SP1(
IN start_date VARCHAR(20))

DYNAMIC RESULT SETS 1
P1: BEGIN

DECLARE SQLCODE integer;
DECLARE table_exists integer default 0;
DECLARE myQuery VARCHAR(200);

SET myQuery = 'CREATE TABLE XYZ AS(SELECT * FROM TABLE WHERE date > '|| start_date ||') WITH DATA';

execute immediate(myQuery);
END P1 

但是,如果您只是参数化日期,那么您实际上并不需要使用动态SQL ...即这也有效

CREATE OR REPLACE PROCEDURE SP1(
IN start_date DATE)

DYNAMIC RESULT SETS 1
P1: BEGIN

CREATE TABLE XYZ AS(SELECT * FROM TABLE WHERE date > start_date) WITH DATA;

END P1

你仍然说你需要一个很长的VARCHAR" ..好好使用CLOB而你没有实际限制

CREATE OR REPLACE PROCEDURE SP1(
IN start_date VARCHAR(20))

DYNAMIC RESULT SETS 1
P1: BEGIN

DECLARE SQLCODE integer;
DECLARE table_exists integer default 0;
DECLARE myQuery CLOB(200000);

SET myQuery = 'CREATE TABLE XYZ AS(SELECT * FROM TABLE WHERE date > '|| start_date ||') WITH DATA';

execute immediate(myQuery);
END P1