Как передать значения из php как отформатированный ввод XML для вызова функции pl / sql

Я новичок в php, XML, pl / SQL. Я сделал функцию pl / SQL, которая хранится в файле php.
Эта функция берет некоторые значения из php в формате XML и вставляет их в таблицу оракулов
Функция pl / SQL прекрасно работает без формата XML. Проблема возникает, когда я даю ее в формате XML.

Я получил эти ошибки. Образец изображения, приведенный ниже:
введите описание изображения здесь

Я хочу принимать переменные php в формате XML всякий раз, когда я вызываю функцию pl / SQL. Как мне это сделать?

Вот код php, указанный ниже:

<?php
$conn = oci_connect('usr', '123', 'localhost/xe');

if (!$conn)
{
trigger_error("Could not connect to database", E_USER_ERROR);
}
else
{
echo "Connection established";
}

insertTable($conn); //This to insert date into table each time.

function insertTable($conn)
{
$year = $_POST["SALYR"];
$month = $_POST["SALMT"];
$empID = $_POST["EMPID"];
$dptCode = $_POST["DPTID"];
$salHD = 'SH';
$description = $_POST["DESCR"][0];
$amount = $_POST["ALAMT"][0];
$optID = 3501;
$trDate = date("Y/m/d", strtotime(date("Y/m/d")));

$function_define = "create or replace FUNCTION save_payroll_row (i_xml in xmltype) return varchar2 is

rw payrollfile%rowtype;
result varchar2(10) ;

v_code NUMBER;
v_errm varchar2(600);select extractvalue(i_xml, '/transaction/salary_year'),
extractvalue(i_xml, '/transaction/salary_month'),
extractvalue(i_xml, '/transaction/employee_id'),
extractvalue(i_xml, '/transaction/department_code'),
extractvalue(i_xml, '/transaction/salary_head'),
extractvalue(i_xml, '/transaction/description'),
extractvalue(i_xml, '/transaction/amount'),
extractvalue(i_xml, '/transaction/operator_id'),
extractvalue(i_xml, '/transaction/transaction_date')

into rw.SALYR, rw.SALMT, rw.EMPID, rw.DPTID, rw.SALHD, rw.DESCR, rw.ALAMT, rw.OPID, rw.TRADT from dual;

insert into PAYROLLFILE (SALYR, SALMT, EMPID, DPTID, SALHD, DESCR, ALAMT, OPID, TRADT)
values (rw.SALYR, rw.SALMT, rw.EMPID, rw.DPTID,rw.SALHD, rw.DESCR, rw.ALAMT, rw.OPID, rw.TRADT);
result := 'success';
return result;Exception

When others then

v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM,1, 600);

DBMS_OUTPUT.PUT_Line('Error Code' || v_code || ': ' || v_errm);

end save_payroll_row;";$stid = oci_parse($conn, $function_define);
oci_execute($stid);
$function_call = "  declare
result varchar2(10);

declare
result varchar2(10);
begin
result := save_payroll_row(
xmltype('
<transaction>
<salary_year>$_POST["SALYR"]</salary_year>
<salary_month>$_POST["SALMT"]</salary_month>
<employee_id>$_POST["EMPID"]</employee_id>
<department_code>$_POST["DPTID"]</department_code>
<salary_head>$salHD</salary_head>
<description>$description</description>
<amount>$amount</amount>
<operator_id>$optID</operator_id>
<transaction_date>$trDate</transaction_date>
</transaction>'));
dbms_output.put_Line(result);
end;" ;

$stid = oci_parse($conn, $function_call);
oci_execute($stid);}

Как начинающий, я думаю, что определенно сделал несколько синтаксисов & Ошибки, связанные с форматом даты, для которых я понятия не имею, чтобы исправить это. Пожалуйста, дайте мне знать для получения дополнительной информации. Спасибо

0

Решение

Мне непонятно, ПОЧЕМУ вы хотите преобразовать свои входные данные в формат xml и передать их таким образом в функцию,
но вы можете сделать это как здесь: создать функцию с xmltype параметр и использование extractvalue чтобы получить все значения. Я также использовал переменную rw payroll%rowtype уменьшить длину кода.

create or replace function save_payroll_row_xml (i_xml in xmltype) return varchar2 is

rw payrollfile%rowtype;
result varchar2(10) ;

begin

select extractvalue(i_xml, '/transaction/salary_year'),
extractvalue(i_xml, '/transaction/salary_month'),
extractvalue(i_xml, '/transaction/employee_id'),
extractvalue(i_xml, '/transaction/department_code'),
extractvalue(i_xml, '/transaction/salary_head'),
extractvalue(i_xml, '/transaction/description'),
extractvalue(i_xml, '/transaction/amount'),
extractvalue(i_xml, '/transaction/operator_id'),
extractvalue(i_xml, '/transaction/transaction_date')
into rw.SALYR, rw.SALMT, rw.EMPID, rw.DPTID,
rw.SALHD, rw.DESCR, rw.ALAMT, rw.OPID, rw.TRADT
from dual;

insert into PAYROLLFILE
(SALYR, SALMT, EMPID, DPTID, SALHD, DESCR, ALAMT, OPID, TRADT)
values
(rw.SALYR, rw.SALMT, rw.EMPID, rw.DPTID,
rw.SALHD, rw.DESCR, rw.ALAMT, rw.OPID, rw.TRADT);
result := 'success';
return result;

end;

Затем вызовите вашу функцию как здесь:

declare
result varchar2(10);
begin
result := save_payroll_row_xml(
xmltype('
<transaction>
<salary_year>2012</salary_year>
<salary_month>05</salary_month>
<employee_id>707</employee_id>
<department_code>30</department_code>
<salary_head>str</salary_head>
<description>something</description>
<amount>102</amount>
<operator_id>7</operator_id>
<transaction_date>2015-12-20</transaction_date>
</transaction>'));
dbms_output.put_Line(result);
end;

Заметки:

  • использовать подготовленные операторы, чтобы избежать внедрения SQL,
  • будьте осторожны с форматом даты, отправляемой в базу данных — он должен соответствовать настройкам Oracle,
  • в моем примере я пропустил обработку исключений, вы можете оставить это как в своем коде, но это должно быть улучшено (постарайтесь избегать when others). Но это не главная тема вашего вопроса,
  • У меня нет опыта работы с PHP, поэтому я мог что-то неправильно понять.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]