我正在创建一个存储过程,它接受一个输入变量并在动态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"..``
我该怎么办?
我需要做些什么改变才能让它发挥作用?
答案 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