Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中调用过程时的PLSQL自定义数据类型_Php_Oracle_Stored Procedures_Plsql - Fatal编程技术网

在php中调用过程时的PLSQL自定义数据类型

在php中调用过程时的PLSQL自定义数据类型,php,oracle,stored-procedures,plsql,Php,Oracle,Stored Procedures,Plsql,我试图用php调用PLSQL过程,但在自定义数据类型方面遇到了问题 我的表中的一列具有下面的自定义数据类型 create or replace TYPE CUST_ADDRESS_TYP AS OBJECT ( STREET_ADDRESS VARCHAR2 (40) , CITY VARCHAR2 (30) , STATE_PROVINCE VARCHAR2 (10) , POSTAL_CODE VARCHAR2 (1

我试图用php调用PLSQL过程,但在自定义数据类型方面遇到了问题

我的表中的一列具有下面的自定义数据类型

create or replace TYPE CUST_ADDRESS_TYP 
    AS OBJECT 
    (   STREET_ADDRESS VARCHAR2 (40) , 
        CITY VARCHAR2 (30) , 
        STATE_PROVINCE VARCHAR2 (10) ,
        POSTAL_CODE VARCHAR2 (10) ,  
        COUNTRY_ID CHAR (2) 
    )  
;
下面是我的程序

create or replace PROCEDURE process_order
(
    p_customer_address in  CUSTOMER.CUST_ADDRESS%TYPE
)
IS
要在PLSQL中插入此列,这是我使用的示例

CUST_ADDRESS_TYP('77 Old Street','San Diego','CA','94567','US')
而且效果很好

然而,当我在PHP中这样做时,我得到

$p_customer_address = "CUST_ADDRESS_TYP('45 High Street','Toronto','CO','94567','CN')";

$stid = oci_parse($conn, 'begin process_order(:p_customer_address); end;');

oci_bind_by_name($stid, ':p_customer_address', $p_customer_address);
警告:oci_execute():ORA-06550:第1行第7列:PLS-00306:调用“处理顺序”ORA-06550时参数的数量或类型错误


谢谢。

您传递的是单个字符串参数,而不是对象类型的实例。字符串的内容没有被计算,它只是被单纯地当作一个字符串来处理——这是绑定变量的优点之一,也是它们如何帮助避免SQL注入的

您可以将类型构造函数放入过程调用中,并直接绑定对象的每个字段:

$stid = oci_parse($conn,
  'begin process_order(CUST_ADDRESS_TYP(:street, :city, :state, :post_code, :country)); end;');

oci_bind_by_name($stid, ':street', "45 High Street");
oci_bind_by_name($stid, ':city', "Toronto");
oci_bind_by_name($stid, ':state', "CO");
oci_bind_by_name($stid, ':post_code', "94567");
oci_bind_by_name($stid, ':country', "CN");

您还可以将customer address对象声明为本地PL/SQL变量,并以相同的方式使用绑定变量填充该对象,然后将其传递给过程(都在同一个匿名PL/SQL块中),但这仅在您想首先调用任何对象方法时才有用。

绑定变量不会计算您传递的内容。正在向过程传递一个字符串,该字符串看起来恰巧像对象实例化,但不会作为一个字符串进行计算—就像单个字符串一样。您可以单独绑定这五个对象字段吗?您是如何构造
$p_customer_address
?看一看似乎与您想要做的类似,但使用varray类型不确定是否可以将其移植到对象,但给出了一些尝试的想法。