在php中调用过程时的PLSQL自定义数据类型
我试图用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
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类型不确定是否可以将其移植到对象,但给出了一些尝试的想法。