php - 如何向oracle数据库发送值?
问题描述
我需要将发票号发送给第三方(Oracle 数据库),他们会回应我试图与他们建立连接的相同结果,我得到了成功的结果,但现在我需要发送一个 SQL 查询来获取回复,但不幸的是我不知道如何发送。这是我使用的连接和查询代码:-
<?php
$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 83.111.41.30)(PORT = 1536)))(CONNECT_DATA=(SID=TEST)))" ;
if($c = OCILogon("XXWEBSITE", "xxwebsite", $db))
{
echo 'success';
$query = "BEGIN
P_INV_NUMBER := '34499';
P_INV_NUM := NULL;
P_UNIT_NO := NULL;
P_CUST_NAME := NULL;
P_INV_DATE := NULL;
P_TRANS_TYPE := NULL;
P_CUST_NO := NULL;
P_OUTSTANDING_AMOUNT := NULL;
L_ERROR := NULL;
APPS.XX_AR_CUST_OS_BAL_PKG.XX_AR_CUST_OS_BAL_PROC ( P_INV_NUMBER, P_INV_NUM, P_UNIT_NO, P_CUST_NAME, P_INV_DATE, P_TRANS_TYPE, P_CUST_NO, P_OUTSTANDING_AMOUNT, L_ERROR );
COMMIT;
END;";
$stid = oci_parse($c, $query);
$check = oci_execute($stid);
print_r($check);
OCILogoff($c);
}
else
{
$err = OCIError();
echo "Connection failed.";
}
?>
他们要求发送的查询是:-
DECLARE
P_INV_NUMBER VARCHAR2(32767);
P_INV_NUM VARCHAR2(32767);
P_UNIT_NO VARCHAR2(32767);
P_CUST_NAME VARCHAR2(32767);
P_INV_DATE DATE;
P_TRANS_TYPE VARCHAR2(32767);
P_CUST_NO NUMBER;
P_OUTSTANDING_AMOUNT NUMBER;
L_ERROR VARCHAR2(32767);
BEGIN
P_INV_NUMBER := '34499';
P_INV_NUM := NULL;
P_UNIT_NO := NULL;
P_CUST_NAME := NULL;
P_INV_DATE := NULL;
P_TRANS_TYPE := NULL;
P_CUST_NO := NULL;
P_OUTSTANDING_AMOUNT := NULL;
L_ERROR := NULL;
APPS.XX_AR_CUST_OS_BAL_PKG.XX_AR_CUST_OS_BAL_PROC ( P_INV_NUMBER, P_INV_NUM, P_UNIT_NO, P_CUST_NAME, P_INV_DATE, P_TRANS_TYPE, P_CUST_NO, P_OUTSTANDING_AMOUNT, L_ERROR );
COMMIT;
END;
如何发送这些参数我尝试了一种方法,但我不知道它是否正确。我需要发送上述内容以获得结果我该怎么做?
解决方案
直接通过 PHP/OCI 调用存储过程可能比尝试通过 PL/SQL“查询”执行它更好:
$stid = oci_parse($c, "call apps.xx_ar_cust_os_bal_pkg.xx_ar_cust_os_bal_proc('34499', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)");
oci_execute($stid);
如果需要返回存储过程的结果,那么就需要使用绑定变量:
$stid = oci_parse($c, "call apps.xx_ar_cust_os_bal_pkg.xx_ar_cust_os_bal_proc('34499', :inv_num, :unit_no, :cust_name, :inv_date, :trans_type, :cust_no, :outstanding_amount, :err)");
/* Do this for each bind variable */
oci_bind_by_name($stid, ":inv_num", $inv_num);
...
oci_execute($stid);
编辑:P_INV_NUMBER
将参数作为绑定变量传递:
$stid = oci_parse($c, "call apps.xx_ar_cust_os_bal_pkg.xx_ar_cust_os_bal_proc(:inv_number, :inv_num, :unit_no, :cust_name, :inv_date, :trans_type, :cust_no, :outstanding_amount, :err)");
oci_bind_by_name($stid, ":inv_number", "34499");
/* Do this for each bind variable */
oci_bind_by_name($stid, ":inv_num", $inv_num);
...
oci_execute($stid);
希望这可以帮助。
推荐阅读
- javascript - 每次更改输入后如何不创建流?
- python - 转换python logger的文本
- javascript - 如何使输入框中的第三个项目具有不同的颜色?(JS、HTML、CSS)
- c++ - 为什么基模板类的方法和属性不能立即可用?
- r - 使用不同类别与子集时,svyboxplot 结果会发生变化
- javascript - 生成查看链接JS
- c# - “退出构造函数时不可为空的事件必须包含非空值”
- django - 如何为仅创建者 django 设置编辑/删除权限
- java - 如果客户端不在 while 循环内,则读取消息失败
- xamarin.forms - Xamarin.Forms 与 FreshMVVM。向 FreshBasePageModel 类添加新属性