将参数传递给DB2 udf的IN谓词 [英] Passing a parameter to IN predicate of DB2 udf

查看:44
本文介绍了将参数传递给DB2 udf的IN谓词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的,


我在将VARCHAR参数(这是一个接受值的
列表)传递给IN谓词时遇到了问题一个DB2用户定义的

函数。


例如,我有一个表(mytable)存储ppl名称&他们的

对应的团体。我想创建一个UDF(myfunc),它选择

来自(mytable)的ppl名称列表,这些名称属于某些动态选择

组。我尝试过以下编码,但是如果我试图提供一组指定的组选择作为单个

参数,它就不起作用。


有人可以帮忙吗?非常感谢!


Tracy


////参考SQL:


创建表mytable(

名称VARCHAR(10),

组CHAR(1)

);


插入mytable值(''Peter'',''A'');

插入mytable值(''John'',''A'');

INSERT into mytable values(''Mary'',''B'');

INSERT into mytable values(''Susan'',''C'');


CREATE FUNCTION myfunc(cgroup VARCHAR(20))

退货表



名称VARCHAR(10) )




语言SQL

读取SQL数据

无外部行动

DETERMINISTIC

返回


SELECT

名称

来自

mytable

where

group in(cgroup)

;

db2" select * from mytable"


NAME GROUP

---------- -----

Peter A
John A

Mary B

Susan C


4条记录被选中。

db2" select * from table(myfunc(char(''A'')))as t1"


NAME

----------

Peter

John


2条记录被选中。

db2" select * from table(myfunc(char(''A,B'')))为t1" ;


NAME

----------


0条记录被选中。

db2" select * from table(myfunc(char('''''''''''''''''''''''')))t1"




NAME

----------


0条记录(s )选择。

解决方案

Tracy写道:

亲爱的,

我在将VARCHAR参数(可接受值的列表)传递给DB2用户定义的
函数的IN谓词时遇到了问题。

例如,我有一个表(mytable)存储ppl名称&他们的相应群体。我想创建一个UDF(myfunc),它选择(mytable)属于某些动态选择组的ppl名称列表。我尝试过以下编码,但是如果我试图提供一组指定的组选择作为单个参数,它就无法工作。

任何人都可以帮忙吗?非常感谢!

Tracy

////参考SQL:

CREATE TABLE mytable(
名称VARCHAR(10),
组CHAR(1)
);

插入mytable值(''Peter'',''A'');
INSERT into mytable values( ''John'',''A'');
INSERT into mytable values(''Mary'',''B'');
INSERT into mytable values('''Susan'', ''C'');

创建功能myfunc(cgroup VARCHAR(20))
返回表

名称VARCHAR(10)


语言SQL
阅读SQL数据
无外部动作
决定性
返回

选择
名称
FROM
mytable
其中
分组(cgroup)
;

db2" select * from mytable"


NAME GROUP
---------- -----
Peter A John A
Mary B
Susan C

4条记录被选中。

db2" select * from table( myfunc(char(''A'')))为t1"



名称
----------
彼得 John

2条记录被选中。

db2" select * from table(myfunc(char(''A,B'')) )如t1"



名称
----------

0条记录被选中。

db2" select * from table(myfunc(char('''''''''''''''''''''''')))t1"



in列表将参数视为单个VARCHAR,而不是

字符串列表。获得目标的最简单方法是使用动态

仅在SQL过程中允许的SQL:


CREATE PROCEDURE myproc(IN cgroup VARCHAR) (20))

BEGIN

DECLARE curtxt VARCHAR(1000);

DECLARE stmt STATEMENT;

DECLARE cur CURSOR WITH RETURN FOR stmt;

SET curtxt =''SELECT * FROM mytab WHERE group IN(''|| cgroup ||'')'';

PREPARE stmt ;

OPEN cur;

END


CALL myproc(''''''''''''''' ''B''''')

如果你的团体有一个固定的长度(简单说单个字符)

并且你想坚持纯SQL你可以尝试这个:


CREATE FUNCTION myfun(cgroup VARCHAR(20))

RETURNS TABLE(名称VARCHAR(10))

RETURN

WITH rec(name,num)

AS SELECT name,1

FROM mytab WHERE group = substr(cgroup, 1,1)

UNION ALL

SELECT mytab.name,num + 1

FROM mytab,rec

WHERE group = substr(cgroup,NULLIF(num + 1,LENGTH) (cgroup)),1)

来自rec的SELECT名称;


SELECT * FROM TABLE(myfun(''AB''))AS F;


-

Serge Rielau

DB2解决方案开发

IBM多伦多实验室


Serge Rielau写道:

Tracy写道:

亲爱的,

我遇到了一个问题将VARCHAR参数(可接受值的列表)传递给DB2用户定义的
函数的IN谓词。

例如,我有一个表(mytable) )存储人名和他们的相应群体。我想创建一个UDF(myfunc),它选择(mytable)属于某些动态选择组的ppl名称列表。我尝试过以下编码,但是如果我试图提供一组指定的组选择作为单个参数,它就无法工作。

任何人都可以帮忙吗?非常感谢!

Tracy

////参考SQL:

CREATE TABLE mytable(
名称VARCHAR(10),
组CHAR(1)
);

插入mytable值(''Peter'',''A'');
INSERT into mytable values( ''John'',''A'');
INSERT into mytable values(''Mary'',''B'');
INSERT into mytable values('''Susan'', ''C'');

创建功能myfunc(cgroup VARCHAR(20))
返回表

名称VARCHAR(10)


语言SQL
阅读SQL数据
无外部动作
决定性
返回

选择
名称
FROM
mytable
其中
分组(cgroup)
;

db2" select * from mytable"


NAME GROUP
---------- -----
Peter A John A
Mary B
Susan C

4条记录被选中。

db2" select * from table( myfunc(char(''A'')))为t1"



名称
----------
彼得 John

2条记录被选中。

db2" select * from table(myfunc(char(''A,B'')) )如t1"



名称
----------

0条记录被选中。

db2" select * from table(myfunc(char('''''''''''''''''''''''')))t1"


in列表将参数视为单个VARCHAR,而不是
字符串列表。获得目标的最简单方法是使用SQL程序中允许的动态SQL:

CREATE PROCEDURE myproc(IN cgroup VARCHAR(20))
BEGIN
DECLARE curtxt VARCHAR(1000);
DECLARE stmt STATEMENT;
DECLARE cur CURSOR WITH RETURN FOR stmt;
SET curtxt =''SELECT * FROM mytab WHERE group IN(' '|| cgroup ||'''''';
PREPARE stmt;
OPEN cur;
END

CALL myproc('''''''' ''','''''''''''

如果你的小组有一个固定的长度(简单来说就是单个字符)
你想坚持使用纯SQL你可以试试这个:

创建功能myfun(cgroup VARCHAR(20))
返回表(名称VARCHAR(10))
返回
用rec(名字, num)
AS SELECT名称,1
FROM mytab WHERE group = substr(cgroup,1,1)
UNION ALL
SELECT mytab.name,num + 1
来自mytab,rec
WHERE gr oup = substr(cgroup,NULLIF(num + 1,LENGTH(cgroup)),1)
来自rec的SELECT名称;

SELECT * FROM TABLE(myfun(''AB'')) )AS F;



哎呀:

NULLIF(num + 1,LENGTH(cgroup)+ 1)


-

Serge Rielau

DB2解决方案开发

IBM多伦多实验室


即使没有固定长度,只要逗号不是有效字符:


CREATE FUNCTION myfun(cgroup VARCHAR(20))返回表(名称

VARCHAR (10))

RETURN SELECT from FROM mytable WHERE POSSTR('',''||| cgroup || '','',

group)> 0


嗯,这是未经测试的(我不能在临时桌上制作功能。)


B.


Dear all,

I have encountered a problem in passing a VARCHAR parameter (which is a
list of accepted values) to the IN predicate of a DB2 user-defined
function.

For example, I have a table (mytable) storing ppl names & their
corresponding groups. I would like to create a UDF (myfunc) that select
a list of ppl names from (mytable) who belong to some dynamic choices
of groups. I have tried the following codings but it doesn''t work if I
try to provide a list of designated choices of groups as a single
parameter.

Can anyone help? Thanks a lot!

Tracy

////Reference SQLs:

CREATE TABLE mytable (
name VARCHAR(10),
group CHAR(1)
);

INSERT into mytable values (''Peter'',''A'');
INSERT into mytable values (''John'',''A'');
INSERT into mytable values (''Mary'',''B'');
INSERT into mytable values (''Susan'',''C'');

CREATE FUNCTION myfunc (cgroup VARCHAR(20))
RETURNS TABLE
(
name VARCHAR(10)
)

LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN

SELECT
name
FROM
mytable
where
group in (cgroup)
;

db2 "select * from mytable"
NAME GROUP
---------- -----
Peter A
John A
Mary B
Susan C

4 record(s) selected.
db2 "select * from table(myfunc(char(''A''))) as t1"
NAME
----------
Peter
John

2 record(s) selected.
db2 "select * from table(myfunc(char(''A,B''))) as t1"
NAME
----------

0 record(s) selected.
db2 "select * from table(myfunc(char(''''''A'''',''''B''''''))) as t1"



NAME
----------

0 record(s) selected.

解决方案

Tracy wrote:

Dear all,

I have encountered a problem in passing a VARCHAR parameter (which is a
list of accepted values) to the IN predicate of a DB2 user-defined
function.

For example, I have a table (mytable) storing ppl names & their
corresponding groups. I would like to create a UDF (myfunc) that select
a list of ppl names from (mytable) who belong to some dynamic choices
of groups. I have tried the following codings but it doesn''t work if I
try to provide a list of designated choices of groups as a single
parameter.

Can anyone help? Thanks a lot!

Tracy

////Reference SQLs:

CREATE TABLE mytable (
name VARCHAR(10),
group CHAR(1)
);

INSERT into mytable values (''Peter'',''A'');
INSERT into mytable values (''John'',''A'');
INSERT into mytable values (''Mary'',''B'');
INSERT into mytable values (''Susan'',''C'');

CREATE FUNCTION myfunc (cgroup VARCHAR(20))
RETURNS TABLE
(
name VARCHAR(10)
)

LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN

SELECT
name
FROM
mytable
where
group in (cgroup)
;

db2 "select * from mytable"



NAME GROUP
---------- -----
Peter A
John A
Mary B
Susan C

4 record(s) selected.

db2 "select * from table(myfunc(char(''A''))) as t1"



NAME
----------
Peter
John

2 record(s) selected.

db2 "select * from table(myfunc(char(''A,B''))) as t1"



NAME
----------

0 record(s) selected.

db2 "select * from table(myfunc(char(''''''A'''',''''B''''''))) as t1"


The in list sees the parameter as a single VARCHAR, not as a list of
strings. Th eeasiest way to get where you want to be is to use dynamic
SQL which is allowed in SQL Procedures only:

CREATE PROCEDURE myproc(IN cgroup VARCHAR(20))
BEGIN
DECLARE curtxt VARCHAR(1000);
DECLARE stmt STATEMENT;
DECLARE cur CURSOR WITH RETURN FOR stmt;
SET curtxt = ''SELECT * FROM mytab WHERE group IN ('' || cgroup || '')'';
PREPARE stmt;
OPEN cur;
END

CALL myproc(''''''A'''', ''''B'''''')

If your groups have a fixed length (say single character for simplicity)
and you want to stick with pure SQL you can try this:

CREATE FUNCTION myfun(cgroup VARCHAR(20))
RETURNS TABLE(name VARCHAR(10))
RETURN
WITH rec(name, num)
AS SELECT name, 1
FROM mytab WHERE group = substr(cgroup, 1, 1)
UNION ALL
SELECT mytab.name, num + 1
FROM mytab, rec
WHERE group = substr(cgroup, NULLIF(num+1, LENGTH(cgroup)), 1)
SELECT name from rec;

SELECT * FROM TABLE(myfun(''AB'')) AS F;

--
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab


Serge Rielau wrote:

Tracy wrote:

Dear all,

I have encountered a problem in passing a VARCHAR parameter (which is a
list of accepted values) to the IN predicate of a DB2 user-defined
function.

For example, I have a table (mytable) storing ppl names & their
corresponding groups. I would like to create a UDF (myfunc) that select
a list of ppl names from (mytable) who belong to some dynamic choices
of groups. I have tried the following codings but it doesn''t work if I
try to provide a list of designated choices of groups as a single
parameter.

Can anyone help? Thanks a lot!

Tracy

////Reference SQLs:

CREATE TABLE mytable (
name VARCHAR(10),
group CHAR(1)
);

INSERT into mytable values (''Peter'',''A'');
INSERT into mytable values (''John'',''A'');
INSERT into mytable values (''Mary'',''B'');
INSERT into mytable values (''Susan'',''C'');

CREATE FUNCTION myfunc (cgroup VARCHAR(20))
RETURNS TABLE
(
name VARCHAR(10)
)

LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN

SELECT
name
FROM
mytable
where
group in (cgroup)
;

db2 "select * from mytable"



NAME GROUP
---------- -----
Peter A
John A
Mary B
Susan C

4 record(s) selected.

db2 "select * from table(myfunc(char(''A''))) as t1"



NAME
----------
Peter
John

2 record(s) selected.

db2 "select * from table(myfunc(char(''A,B''))) as t1"



NAME
----------

0 record(s) selected.

db2 "select * from table(myfunc(char(''''''A'''',''''B''''''))) as t1"


The in list sees the parameter as a single VARCHAR, not as a list of
strings. Th eeasiest way to get where you want to be is to use dynamic
SQL which is allowed in SQL Procedures only:

CREATE PROCEDURE myproc(IN cgroup VARCHAR(20))
BEGIN
DECLARE curtxt VARCHAR(1000);
DECLARE stmt STATEMENT;
DECLARE cur CURSOR WITH RETURN FOR stmt;
SET curtxt = ''SELECT * FROM mytab WHERE group IN ('' || cgroup || '')'';
PREPARE stmt;
OPEN cur;
END

CALL myproc(''''''A'''', ''''B'''''')

If your groups have a fixed length (say single character for simplicity)
and you want to stick with pure SQL you can try this:

CREATE FUNCTION myfun(cgroup VARCHAR(20))
RETURNS TABLE(name VARCHAR(10))
RETURN
WITH rec(name, num)
AS SELECT name, 1
FROM mytab WHERE group = substr(cgroup, 1, 1)
UNION ALL
SELECT mytab.name, num + 1
FROM mytab, rec
WHERE group = substr(cgroup, NULLIF(num+1, LENGTH(cgroup)), 1)
SELECT name from rec;

SELECT * FROM TABLE(myfun(''AB'')) AS F;


Oops:
NULLIF(num+1, LENGTH(cgroup) + 1)

--
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab


Even without fixed length, as long as comma is not a valid character:

CREATE FUNCTION myfun(cgroup VARCHAR(20)) RETURNS TABLE(name
VARCHAR(10))
RETURN SELECT name FROM mytable WHERE POSSTR('','' || cgroup || '','',
group) > 0

Well, it''s untested (i can''t make a FUNCTION on a temp table.)

B.


这篇关于将参数传递给DB2 udf的IN谓词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆