ORA-06550: 第 15 行,第 7 列:\nPLS-00103: 遇到符号“BEGIN”

ORA-06550: line 15, column 7:\nPLS-00103: Encountered the symbol "BEGIN"

我正在尝试使用 PHP Engine v5.1 和用于 PHP 的 Oracle OCI 扩展模块从 php 脚本执行程序包中存储的 oracle 函数。为此,我有 2 个 plsql 块,它们将获取 pk member_id 和 product_id 并将用于执行函数。在此过程中,我收到以下错误

ORA-06550: line 15, column 7:\nPLS-00103: Encountered the symbol "BEGIN"

我不知道如何解决这个错误?

<?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;