Я пытаюсь вызвать PLSQL PROCEDURE с 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
для вставки в этот colum в 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 - но это полезно только тогда, когда вы действительно хотите вызвать любые методы объектов.
$p_customer_address
?