【问题标题】:How to send value to oracle database?如何向oracle数据库发送值?
【发布时间】:2018-05-01 04:18:16
【问题描述】:

我需要将发票号发送给第三方(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;

如何发送这些参数我尝试了一种方法,但我不知道它是否正确。我需要发送上述内容以获得结果我该怎么做?

【问题讨论】:

  • 你试试你的代码吗?发生了什么?
  • 顺便说一句,这不是查询。同样在 PL/SQL 中,标量变量默认以 null 开头,因此 := NULL 分配没有任何作用。您可以通过在初始化时分配一个值来保存另一行。并且没有要求以大写形式编写 PL/SQL - 它不是 COBOL,也不是 1974 年。

标签: php oracle


【解决方案1】:

您最好直接通过 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);

希望这会有所帮助。

【讨论】:

  • 由于 '34499' 会有所不同,它也应该作为绑定变量传递(因为连接文本以构建 SQL 字符串可能存在安全风险,并影响应用程序的可扩展性)
  • 当然,我同意。
  • 感谢您的帮助。检查后将返回
  • 你能告诉我如何发送 P_INV_NUMBER := '34499';并对此做出回应?
  • @rahulshukla 您可以将其直接发送到存储的过程中(就像我在上面所做的那样),或者您可以将其作为绑定变量传递。
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2010-12-25
  • 2023-02-07
  • 2023-03-16
  • 1970-01-01
  • 2020-04-09
  • 2015-06-26
相关资源
最近更新 更多