2013-10-31 51 views
1

我正在用PHP + Oracle開發一個簡單的系統。數據庫有一個過程,我需要發送一些變量並獲得返回。很簡單,但我錯過了一些東西。Oci_bind_by_name返回null

我將顯示所有代碼,我認爲問題出在$ 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不會出錯,而且綁定變量爲空。

問候,

回答

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; 

通知,聲明後,我不得不清理字符串,沒有空格... 我希望這幫助一些一,

問候,