Пользовательский тип данных PLSQL при вызове процедур в php

1

Я пытаюсь вызвать 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

Спасибо.

  • 0
    Переменная связывания не оценивает то, что вы передаете. Процедуре передается строка, которая выглядит как экземпляр объекта, но не оценивается как единое целое - просто как одна строка. Можете ли вы связать пять полей объекта отдельно? Как вы $p_customer_address ?
  • 0
    Взгляните на oracle.com/technetwork/articles/fuecks-sps-095636.html, похоже на то, что вы хотите сделать, но с типом varray не уверен, сможете ли вы перенести это на объект, но дает вам некоторые идеи о том, что пытаться.
Теги:
stored-procedures
plsql

1 ответ

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
    большое большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню