将多个值传递给另一个函数内的函数
Posted
技术标签:
【中文标题】将多个值传递给另一个函数内的函数【英文标题】:Passing multiple values to a function inside another function 【发布时间】:2015-09-07 20:30:08 【问题描述】:我有一个函数调用另一个函数并使用它的值。我已经搜索并发现(并证明)您必须这样做:
SELECT * from TABLE(FUNCTION proc1()) as tab_proc1(val1, val2);
直到那里,一切正常,但我的函数(在本例中为 proc1())具有我需要传递的值,并且由于该语句在另一个函数中,我需要将结果分配给一些值 - 例如:
select * into impo_ori, impt_ori, impo_des
from Table(procedure fc_moneda(cmon, importe, cmon_ori, cmon_des));
当我执行以下功能时:
create procedure ala(cmon integer, importe decimal, cmon_ori integer, cmon_des integer)
returning boolean;
define impo_ori, impt_ori, impo_des decimal;
define ver boolean;
select * into impo_ori, impt_ori, impo_des
from Table(procedure fc_moneda(cmon, importe, cmon_ori, cmon_des));
//continues...
return ver;
end procedure;
但将 fc_moneda 中的变量(如 cmon、importe...等)视为值而不是变量。如果我传递值,那句话就有效 喜欢:
select * into impo_ori,impt_ori,impo_des
from Table(procedure fc_moneda(1, 100, 1, 2));
任何帮助将不胜感激。
【问题讨论】:
我必须做一些实验。问题不在于将值传递给另一个函数——问题在于将值传递给 SELECT 语句的 TABLE 子句中使用的函数(在这种情况下)。也就是说,如果您在另一个上下文中调用另一个存储过程,或者甚至在 SELECT 语句之外调用fc_moneda()
,那么传递值不会有任何问题。我不确定(还)它在 SQL 中是怎么回事,虽然我可以做出一些猜测——但我不准备分享这些,直到我做了实验。
【参考方案1】:
我无法访问 10.00.UC1,我能做的最好的就是 11.50.FC9。
我已经尝试了下一个示例,并且效果符合预期:
[infx1210@tardis ~]$ dbaccess -e test test.sql
Database selected.
CREATE TABLE tab1 (
col1 INTEGER
);
Table created.
INSERT INTO tab1 VALUES (1);
1 row(s) inserted.
INSERT INTO tab1 VALUES (2);
1 row(s) inserted.
CREATE TABLE tab2 (
col1 INTEGER
);
Table created.
CREATE FUNCTION sp1(arg1 INTEGER)
RETURNING INTEGER;
DEFINE var INTEGER;
SELECT col1 + 10 INTO var
FROM tab1
WHERE col1 = arg1;
RETURN var;
END FUNCTION;
Routine created.
CREATE PROCEDURE sp2(arg1 INTEGER)
DEFINE var INTEGER;
CALL sp1(arg1) RETURNING var;
INSERT INTO tab2 VALUES (var);
END PROCEDURE;
Routine created.
EXECUTE PROCEDURE sp2(1);
Routine executed.
SELECT * FROM tab2;
col1
11
1 row(s) retrieved.
CREATE PROCEDURE sp3(arg1 INTEGER)
DEFINE var INTEGER;
SELECT * INTO var
FROM TABLE(procedure sp1(arg1));
INSERT INTO tab2 VALUES (var);
END PROCEDURE;
Routine created.
EXECUTE PROCEDURE sp3(2);
Routine executed.
SELECT * FROM tab2;
col1
11
12
2 row(s) retrieved.
Database closed.
[infx1210@tardis ~]$
查看您的测试似乎唯一有效的方法是使用CALL
。但是您可以尝试另一种方法,将参数传递给临时表:
[infx1150@tardis ~]$ dbaccess -e test test.sql
Database selected.
CREATE TABLE tab1 (
col1 INTEGER
);
Table created.
INSERT INTO tab1 VALUES (1);
1 row(s) inserted.
INSERT INTO tab1 VALUES (2);
1 row(s) inserted.
CREATE TABLE tab2 (
col1 INTEGER
);
Table created.
CREATE FUNCTION sp1(arg1 INTEGER)
RETURNING INTEGER;
DEFINE var INTEGER;
SELECT col1 + 10 INTO var
FROM tab1
WHERE col1 = arg1;
RETURN var;
END FUNCTION;
Routine created.
CREATE PROCEDURE sp1(arg1 INTEGER)
DEFINE var INTEGER;
CREATE TEMP TABLE tmp1(
col1 INTEGER
) WITH NO LOG;
INSERT INTO tmp1 VALUES (arg1);
SELECT sp1(col1) INTO var
FROM tmp1;
INSERT INTO tab2 VALUES (var);
END PROCEDURE;
Routine created.
EXECUTE PROCEDURE sp1(1);
Routine executed.
SELECT * FROM tab2;
col1
11
1 row(s) retrieved.
Database closed.
[infx1150@tardis ~]$
关于返回的多行,如果这是预期的行为,那么您必须更改程序以处理返回的每一行,例如:
[infx1150@tardis ~]$ dbaccess -e test test.sql
Database selected.
CREATE TABLE tabs(
col1 INTEGER
);
Table created.
CREATE FUNCTION series(lim INTEGER)
RETURNING INTEGER;
DEFINE i INTEGER;
FOR i IN (1 to lim)
RETURN i WITH RESUME;
END FOR;
END FUNCTION;
Routine created.
CREATE PROCEDURE sp_i_tabs(lim INTEGER)
DEFINE var INTEGER;
FOREACH EXECUTE FUNCTION series(lim) INTO var
INSERT INTO tabs VALUES (var);
END FOREACH
END PROCEDURE;
Routine created.
EXECUTE PROCEDURE sp_i_tabs(5);
Routine executed.
SELECT * FROM tabs;
col1
1
2
3
4
5
5 row(s) retrieved.
Database closed.
[infx1150@tardis ~]$
【讨论】:
除此之外...我得出这个结论是因为当我调用程序(使用原始语句)时出现此错误:在查询中的任何表中找不到列(cmon)(或 SLV 未定义) )。所以我用 fc_moneda(1, importe, cmon_ori, cmon_des) 进行了测试,并给出了与 nex 变量相同的错误(Column (importe) not found in any table in the query (or SLV is undefined))以上是关于将多个值传递给另一个函数内的函数的主要内容,如果未能解决你的问题,请参考以下文章