我正在使用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);
?>
应用程序不会返回任何错误,并且绑定变量为空。
此致
答案 0 :(得分: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;
注意,在声明之后,我不得不清理字符串,没有空格...... 我希望这对某人有所帮助,
此致