я пытаюсь выполнить хранимую функцию оракула в пакете из сценария php, используя PHP Engine v5.1 и модуль расширения Oracle OCI для PHP. И для этой цели у меня есть 2 блока plsql, которые будут извлекать pk member_id и product_id и будут использоваться при выполнении функции. В этом процессе я получаю следующую ошибку
ORA-06550: строка 15, столбец 7: \ nPLS-00103: обнаружен символ
"НАЧАТЬ"
Я не уверен, как решить эту ошибку?
<?php
$conn = oci_connect("username","password","localdb");
$CONFIG_NAME='DirectType';
$BUS_SEG_CODE='';
$PRODUCT_NUM='130342';
$MEMBER_NAME='87307-3';
$EFFECTIVE_DATE=strtotime('2016-12-01');
$MODEL_DATE=time();
$CURRENCY='USD';
$REALM_NUM=1024;
$RESOLVED_PRICE=111;
$RESOLVED_CURRENCY='USD';
if ($conn) {
echo "Connection Successful"."\n";
echo "System time is ".time();
$sql_proc = "DECLARE
v_MEMBER_ID NUMBER;
v_PRODUCT_ID NUMBER;
BEGIN
SELECT cat_map_id INTO v_PRODUCT_ID
FROM mn_cat_map WHERE product_num = :PRODUCT_NUM and catalog_type = 'INT';
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Product Error');
return;
END;
BEGIN
SELECT member_id INTO v_MEMBER_ID
FROM mn_member WHERE member_name = :MEMBER_NAME;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Customer Error');
return;
END;
BEGIN PACKAGE_NAME.function_name(
:CONFIG_NAME,
:BUS_SEG_CODE,
v_MEMBER_ID,
v_PRODUCT_ID,
:EFFECTIVE_DATE,
:MODEL_DATE,
:CURRENCY_CODE,
:REALM_NUM,
:RESOLVED_PRICE,
:RESOLVED_CURRENCY
);
END;
";
$stmt = oci_parse($conn,$sql_proc);
// Bind the input parameter
oci_bind_by_name($stmt,':CONFIG_NAME',$CONFIG_NAME);
oci_bind_by_name($stmt,':BUS_SEG_CODE',$BUS_SEG_CODE);
oci_bind_by_name($stmt,':EFFECTIVE_DATE',$EFFECTIVE_DATE);
oci_bind_by_name($stmt,':MODEL_DATE',$MODEL_DATE);
oci_bind_by_name($stmt,':CURRENCY_CODE',$CURRENCY);
oci_bind_by_name($stmt,':REALM_NUM',$REALM_NUM);
oci_bind_by_name($stmt,':RESOLVED_PRICE',$RESOLVED_PRICE);
oci_bind_by_name($stmt,':RESOLVED_CURRENCY',$RESOLVED_CURRENCY);
// Parse the statement. Note there is no final semi-colon in the SQL statement
$result=oci_execute($stmt);
if (!$result){
$e = oci_error($stmt); // For oci_execute errors pass the statement handle
print htmlentities($e['message']);
print "\n<pre>\n";
print htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", "^");
print "\n</pre>\n";
}
else {
echo "Execute STMT returns True or False : ".$result;
echo "Resolved Price is : ".$RESOLVED_PRICE. "\n";
}
echo "</pre>";
oci_free_statement($stmt);
oci_close($conn);
}
else {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
?>
Поместите все в один блок, а не в 3 отдельных блока:
Изменить это:
DECALRE
...
BEGIN
...
END;
BEGIN
...
END;
BEGIN
...
END;
к этому:
DECLARE
...
BEGIN
SELECT ..
SELECT ..
FUNCTION CALL ..
END;
Других решений пока нет …