Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将类似子查询的参数发送到SQL过程中?_Php_Sql_Firebird - Fatal编程技术网

Php 如何将类似子查询的参数发送到SQL过程中?

Php 如何将类似子查询的参数发送到SQL过程中?,php,sql,firebird,Php,Sql,Firebird,我有一个firebird数据库,在那里我调用一个过程来获取一些数据。这个过程需要一个ID,所以我有两个php查询,其中一个给我所有的ID,另一个调用这个过程 $queryP ="SELECT PROVEEDOR_ID FROM PROVEEDORES"; ...some code... while ($RowQ = ibase_fetch_object ($QueryObject)) { $queryCompras =SELECT SUM(IMPORTE) FROM ORSP_C

我有一个firebird数据库,在那里我调用一个过程来获取一些数据。这个过程需要一个ID,所以我有两个php查询,其中一个给我所有的ID,另一个调用这个过程

$queryP ="SELECT PROVEEDOR_ID FROM PROVEEDORES";
...some code...
while ($RowQ = ibase_fetch_object ($QueryObject)) 
{   
    $queryCompras =SELECT SUM(IMPORTE) FROM ORSP_CM_COMPRAS_PROV($RowQ->PROVEEDOR_ID, '2019-01-01', '2019-12-31', 'B', 'P', 'N');
...some code...
我想做一些像

 SELECT SUM(COMPRA_IMPORTE) FROM ORSP_CM_COMPRAS_PROV((SELECT PROVEEDOR_ID FROM PROVEEDORES), '2019-01-01', '2019-12-31', 'B', 'P', 'N'); 
为了避免做太多的数据库调用,但我

语句失败,SQLSTATE=21000 单件选择中的多行


有什么方法可以做到这一点吗?

您可以将子查询(或者在本例中为表)和存储过程连接起来以获得所需的效果

选择总和(压缩输入)
来自Proveedoresp
在1=1上,左连接ORSP\u CM\u COMPRAS\u PROV(p.PROVEEDOR\u ID,'2019-01-01','2019-12-31','B','p','N')

请注意,我使用的是
left join
,但它在加入存储过程时的实际效果类似于Microsoft SQL Server调用的
OUTER APPLY

您尝试的查询将不起作用,因为Firebird需要的是标量值,而不是一组行,我很难把我的头绕在那上面。。。即使它工作得很好。。。所以我想到的只是另一个存储过程,它在循环中执行第一个。现在,操作正在数据库服务器上从头到尾地完成。(顺便说一句,这“可能是件好事,也可能是件坏事”,这取决于服务器对存储过程的实现实际上有多好…@MikeRobinson这也是一个选项,尽管最终它会产生与使用连接存储过程相同的效果。Firebird将为每一行执行存储过程(并传递
p.PROVEEDOR_ID
)的值,并将存储过程中的行连接到该行。Mb我忘记指定我正在使用数据库备份,因此无法创建新过程。新的查询工作得很好,我只是将交叉连接更改为左连接,因为出现了“获取操作没有当前记录”错误。谢谢你们两位:)@jorgegalardo应该是的。@BrakNicku他就是这么说的。但是,我测试了我的解决方案,它使用了交叉连接(和内部连接),但是显然我没有测试存储过程不产生行的情况。