Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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 Oci\u按\u名称绑定\u返回null_Php_Oracle_Oracle Call Interface - Fatal编程技术网

Php Oci\u按\u名称绑定\u返回null

Php Oci\u按\u名称绑定\u返回null,php,oracle,oracle-call-interface,Php,Oracle,Oracle Call Interface,我正在用PHP+Oracle开发一个简单的系统。数据库有一个程序,我需要发送一些变量并获取返回值。很简单,但我遗漏了一些东西 我将显示所有代码,我认为问题出在$sql中 这是在Oracle SQL Developer中运行的过程: Declare nAlternativo Number; nTipo_Custo_Id Number; Begin web.karcst_price_api_pkg.Dre_Pre

我正在用PHP+Oracle开发一个简单的系统。数据库有一个程序,我需要发送一些变量并获取返回值。很简单,但我遗漏了一些东西

我将显示所有代码,我认为问题出在$sql中

这是在Oracle SQL Developer中运行的过程:

Declare
    nAlternativo                    Number;
    nTipo_Custo_Id                  Number;
Begin
web.karcst_price_api_pkg.Dre_Preco_Bruto_p  ( pp_Org_Id                        => 0
                                          , pp_Item                          => '6043830'
                                          , pp_Prazo_Ins                     => 30
                                          , pp_Estado                        => 'SP'
                                          , pp_Estado_Faturamento            => null
                                          , pp_Cidade                        => 'SAO PAULO'
                                          , pp_Tipo_Frete                    => 'CIF'
                                          , pp_Preco_Venda_Bruta             => 5
                                          , pp_Moeda                         => 'BRL'
                                          , pp_Embalagem                     => 'Padrao'
                                          , pp_Preco_Outros_Custos_Com       => 0
                                          , pp_Pedido                        => ''
                                          , pp_Pedido_Item                   => ''
                                          , pp_Operacao                      => ''
                                          , pp_Cnpj_Cpf                      => ''
                                          , pp_Alternativo                   =>nAlternativo
                                          , pp_Tipo_Custo_Id                => nTipo_Custo_Id);
  dbms_output.put_line('nAlternativo                   : '|| nAlternativo);
  dbms_output.put_line('nTipo_Custo_Id                 : '|| nTipo_Custo_Id);
End;
DBMS输出:

nAlternativo                   : 3
nTipo_Custo_Id                 : 1480
PHP代码:

<?php
$conn = oci_connect('-', '-', $MYDB); // CONECTED OK

$script = 'BEGIN web.karcst_price_api_pkg.Dre_Preco_Bruto_p(:pp_Org_Id,:pp_Item,:pp_Prazo_Ins,:pp_Estado,:pp_Estado_Faturamento,:pp_Cidade,:pp_Tipo_Frete,:pp_Preco_Venda_Bruta,:pp_Moeda,:pp_Embalagem,:pp_Preco_Outros_Custos_Com,:pp_Pedido,:pp_Pedido_Item,:pp_Operacao,:pp_Cnpj_Cpf,:pp_Alternativo,:pp_Tipo_Custo_Id); END;';
$stmt = oci_parse($conn, $script) or die('Cannot parse query');

$pp_Org_Id = 0;
$pp_item = '6043830';
$pp_Prazo_Ins = 30;
$pp_Estado = "SP";
$pp_Estado_Faturamento = NULL;
$pp_Cidade = "São Paulo";
$pp_Tipo_Frete = "CIF";
$pp_Preco_Venda_Bruta = 5;
$pp_Moeda = "BRL";
$pp_Embalagem = "Padrao";
$pp_Preco_Outros_Custos_Com = 0;
$pp_Pedido = '';
$pp_Pedido_Item = '';
$pp_Operacao = '';
$pp_Cnpj_Cpf = '';

oci_bind_by_name($stmt, ":pp_Org_Id", $pp_Org_Id) or die ("Crap: $pp_Org_Id");
oci_bind_by_name($stmt, ":pp_Item", $pp_Item) or die ("Crap: $pp_Item");
oci_bind_by_name($stmt, ":pp_Prazo_Ins", $pp_Prazo_Ins) or die ("Crap: $pp_Prazo_Ins");
oci_bind_by_name($stmt, ":pp_Estado", $pp_Estado) or die ("Crap: $pp_Estado");
oci_bind_by_name($stmt, ":pp_Estado_Faturamento", $pp_Estado_Faturamento) or die ("Crap: $pp_Estado_Faturamento");
oci_bind_by_name($stmt, ":pp_Cidade", $pp_Cidade) or die ("Crap: $pp_Cidade");
oci_bind_by_name($stmt, ":pp_Tipo_Frete", $pp_Tipo_Frete) or die ("Crap: $pp_Tipo_Frete");
oci_bind_by_name($stmt, ":pp_Preco_Venda_Bruta", $pp_Preco_Venda_Bruta) or die ("Crap: $pp_Preco_Venda_Bruta");
oci_bind_by_name($stmt, ":pp_Moeda", $pp_Moeda) or die ("Crap: $pp_Moeda");
oci_bind_by_name($stmt, ":pp_Embalagem", $pp_Embalagem) or die ("Crap: $pp_Embalagem");
oci_bind_by_name($stmt, ":pp_Preco_Outros_Custos_Com", $pp_Preco_Outros_Custos_Com) or die ("Crap: $pp_Preco_Outros_Custos_Com");
oci_bind_by_name($stmt, ":pp_Pedido", $pp_Pedido) or die ("Crap: $pp_Pedido");
oci_bind_by_name($stmt, ":pp_Pedido_Item", $pp_Pedido_Item) or die ("Crap: $pp_Pedido_Item");
oci_bind_by_name($stmt, ":pp_Operacao", $pp_Operacao) or die ("Crap: $pp_Operacao");
oci_bind_by_name($stmt, ":pp_Cnpj_Cpf", $pp_Cnpj_Cpf) or die ("Crap: $pp_Cnpj_Cpf");
oci_bind_by_name($stmt, ":pp_Alternativo", $pp_Alternativo, 500) or die ("Crap: pp_Alternativo");
oci_bind_by_name($stmt, ":pp_Tipo_Custo_Id", $pp_Tipo_Custo_Id, 500) or die ("Crap: pp_tipo_custo_id");

oci_execute($stmt);

var_dump($pp_Tipo_Custo_Id); // NULL

oci_free_statement($stmt);
oci_close($conn);
?>
应用程序retuns没有错误,绑定变量为空


关于,

我解决了设置DBMS_OUTPUT.ENABLE的问题,并更改了代码以通过bdms获取返回

大概是这样的:

$s = "BEGIN DBMS_OUTPUT.ENABLE(1000000); END;";
$stid = oci_parse($conn, $s);
$r = oci_execute($stid);
oci_free_statement($stid);

$script = "DECLARE
           nAlternativo Number; 
       BEGIN
       web.karcst_price_api_pkg.Dre_Preco_Bruto_p(pp_Alternativo => nAlternativo);
           dbms_output.put_line('nAlternativo: '|| nAlternativo);                                             END;";
    $script = trim($script);
    $script = str_replace(' ','',$script);
    $script = str_replace('   ','',$script);
    $script = str_replace('\r\n','',$script);
    $script = preg_replace( "/\r|\n/", "", $script);

    $stmt = oci_parse($conn, $script) or die('Cannot parse query');

$s = oci_parse($conn, "BEGIN dbms_output.get_line(:ln, :st); END;");
    oci_set_prefetch($s, 1);
    oci_bind_by_name($s, ":ln", $ln, 100);
    oci_bind_by_name($s, ":st", $st, null, SQLT_INT);
    $res = false;
    while (($succ = oci_execute($s)) && !$st) {
        $res[] = $ln;  // append each line to the array
    }

    echo "<pre>";
    var_dump($res);
    exit;
注意,声明之后,我必须清理字符串,没有空格。。。 我希望这能帮助一些人

问候,