将多个值传递给另一个函数内的函数

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))

以上是关于将多个值传递给另一个函数内的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 include 函数通过 URL 将变量/值传递给另一个 PHP 文件(通过 HTTP)? (PHP)

将变量传递给另一个页面上的函数

如何将纬度和经度传递给另一个函数 - 快速定位

将值传递给另一个组件

将结果集值传递给另一个类

R,函数内的值传递