Я новичок в 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);}
Как начинающий, я думаю, что определенно сделал несколько синтаксисов & Ошибки, связанные с форматом даты, для которых я понятия не имею, чтобы исправить это. Пожалуйста, дайте мне знать для получения дополнительной информации. Спасибо
Мне непонятно, ПОЧЕМУ вы хотите преобразовать свои входные данные в формат 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;
Заметки:
when others
). Но это не главная тема вашего вопроса,Других решений пока нет …