Я пытаюсь вызвать ПРОЦЕДУРУ PLSQL с php, но у меня проблемы с пользовательскими типами данных.
Один из столбцов в моей таблице имеет пользовательский тип данных ниже.
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
Спасибо.
Вы передаете один строковый аргумент, а не экземпляр вашего типа объекта. Содержимое строки не оценивается, оно просто рассматривается как строка — это одно из преимуществ переменных связывания и того, как они помогают избежать внедрения 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");
Вы также можете объявить объект адреса клиента как локальную переменную PL / SQL и заполнить его таким же образом переменными связывания, а затем передать это процедуре — все в одном и том же анонимном блоке PL / SQL — но это полезно только в том случае, если Вы хотите сначала вызвать любые методы объекта.
Других решений пока нет …