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

时间:2015-11-16 22:56:31

标签: php oracle stored-procedures plsql

我正在尝试使用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

谢谢。

1 个答案:

答案 0 :(得分:0)

您传递的是单个字符串参数,而不是对象类型的实例。不对字符串的内容进行求值,它只是纯粹作为字符串处理 - 这是绑定变量的优点之一,以及它们如何帮助避免SQL注入。

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

{{1}}

您还可以将客户地址对象声明为本地PL / SQL变量,并以与绑定变量相同的方式填充它,然后将其传递给过程 - 所有这些都在同一个匿名PL / SQL块中 - 但这是仅在您想要首先调用任何对象方法时才有用。

相关问题