2015-11-16 2 views
1

Я пытаюсь вызвать PLSQL PROCEDURE с помощью php, но у меня возникают проблемы с настраиваемыми типами данных.Тип пользовательских данных 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 

для вставки в этот 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

Спасибо.

+0

Переменная связывания не оценивает, что вы проходите. Процедуре передается строка, которая выглядит как экземпляр объекта, но не оценивается как одна - как отдельная строка. Можете ли вы связать пять полей объекта отдельно? Как вы строите '$ p_customer_address'? –

+0

Взгляните на http://www.oracle.com/technetwork/articles/fuecks-sps-095636.html похоже на то, что вы хотите сделать, но с типом varray не уверены, можете ли вы перенести это на объект, но дает вам некоторые идеи о том, что попробовать. –

ответ

0

Вы передаете один строковый аргумент, а не экземпляр вашего типа объекта. Содержимое строки не оценивается, оно просто трактуется как строка, что является одним из преимуществ связующих переменных и того, как они помогают избежать 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 - но это полезно только в том случае, если вы хотите на самом деле вызвать любые методы объектов.

+0

большое спасибо –

Смежные вопросы