我正在尝试使用php调用PLSQL PROCEDURE,但我遇到了自定义数据类型的问题。
我表格中的一列有下面的自定义数据类型。
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:调用' PROCESS_ORDER'中的参数数量或参数类型错误ORA-06550
谢谢。
答案 0 :(得分:0)
您传递的是单个字符串参数,而不是对象类型的实例。不对字符串的内容进行求值,它只是纯粹作为字符串处理 - 这是绑定变量的优点之一,以及它们如何帮助避免SQL注入。
您可以将类型构造函数放在过程调用中并直接绑定对象的每个字段:
{{1}}
您还可以将客户地址对象声明为本地PL / SQL变量,并以与绑定变量相同的方式填充它,然后将其传递给过程 - 所有这些都在同一个匿名PL / SQL块中 - 但这是仅在您想要首先调用任何对象方法时才有用。