2014-09-19 76 views
0

我有一个问题关于存储的过程,所以我有这个程序保存:Oracle存储过程在PHP处理

CREATE OR REPLACE PROCEDURE WELTESADMIN.TOTALFABRICATION 
    (SUBCONT IN VARCHAR, PROJECT IN VARCHAR, TOTALFABRICATIONRESULT OUT NUMBER) AS 
BEGIN 
    SELECT FABRICATION.MARKING + FABRICATION.CUTTING + FABRICATION.ASSEMBLY + FABRICATION.WELDING + 
      FABRICATION.DRILLING + FABRICATION.FINISHING 
    INTO TOTALFABRICATIONRESULT 
    FROM FABRICATION 
    WHERE SUBCONT_ID = SUBCONT 
     AND PROJECT_NAME = PROJECT; 
END; 

和IM的处理,在PHP等,

$subcontValue = "RIYANTO"; 
    $projectValue = "PROCESSHOUSE"; 

    $sql = "BEGIN TOTALFABRICATION(:SUBCONT, :PROJECT); END;"; 
    $stmt = oci_parse($conn, $sql); 

    oci_bind_by_name($stmt, ":SUBCONT", $subcontValue); 
    oci_bind_by_name($stmt, ":PROJECT", $projectValue); 
    oci_define_by_name($stmt, "TOTALFABRICATIONRESULT", $result); 

    oci_execute($stmt); 

    echo $result; 

我相信,提供的所有变量都是正确的,连接是好的,并且可以在SQL PLUS 中处理,而不是在im端获得这个错误,

警告:oci_execute():ORA-06550:第1行,第7列:PLS-00306:在调用'TOTALFABRICATION'时出错的数量或类型参数ORA-06550:第1行,第7列:PL/SQL:语句忽略在C:\ XAMPP \ htdocs中\ WeltesInformationCenter \ newEmptyPHP.php上线39

回答

1

你的过程实际上有参数(二IN和一个OUT):

CREATE OR REPLACE PROCEDURE WELTESADMIN.TOTALFABRICATION 
    (SUBCONT IN VARCHAR, 
    PROJECT IN VARCHAR, 
    TOTALFABRICATIONRESULT OUT NUMBER) AS 

所以,从PHP,你应该写:

$sql = "BEGIN TOTALFABRICATION(:SUBCONT, :PROJECT, :TOTALFABRICATIONRESULT); END;"; 
    #             ^^^^^^^^^^^^^^^^^^^^^^^ 

而且bind输出参数一些变量:

oci_bind_by_name($stmt, "TOTALFABRICATIONRESULT", $result, 300); 
#               ^^^ 
#              maxlength 

请注意,根据the documentation

您必须指定maxlength使用OUT绑定时,使PHP分配足够的内存来保存返回的值。

+0

感谢sylvain的建议 – marmar 2014-09-23 03:10:21