1

我正在使用 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);
?>

该应用程序没有返回错误,并且绑定变量为空。

问候,

4

1 回答 1

0

我解决了设置 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;

注意,在声明之后,我必须清理字符串,没有空格......我希望这对某人有所帮助,

问候,

于 2013-11-04T18:28:04.660 回答