Oracle Proc с критериями даты работает, но не обновляется - PullRequest
1 голос
/ 23 декабря 2011

У меня есть пробник, выполняющий хранимую процедуру Oracle через PHP.Я получаю успешное возвращаемое значение, но процедура не обновляет строки.

Вот определение процедуры.

CREATE OR REPLACE PACKAGE trans_data AS 
  PROCEDURE UPDATE_TRANS_BY_NAME(
    var_FName IN TRANSACTION.FIRST_NAME%type,
    var_LName IN TRANSACTION.LAST_NAME%type,
    var_DOB IN TRANSACTION.DOB%type,
    var_PolNum IN TRANSACTION.POLICY_NUMBER%type,
    var_TransStatus IN TRANSACTION.TRANS_STATUS%type,
    var_Comp IN TRANSACTION.COMPANY%type,
    var_LineOfBusiness IN TRANSACTION.LINE_OF_BUSINESS%type,
    var_PlanCode IN TRANSACTION.PLAN_CODE%type,
    var_AppDate IN TRANSACTION.APP_DATE%type,
    var_IssueDate IN TRANSACTION.ISSUE_DATE%type,
    var_FaceAmt IN TRANSACTION.FACE_AMT%type,
    var_PolicyStatus IN TRANSACTION.POLICY_STATUS%type,
    var_PaidAmt IN TRANSACTION.PAID_AMT%type,
    var_Return OUT VARCHAR2
  );  
END trans_data;

CREATE OR REPLACE PACKAGE BODY trans_data AS 
  PROCEDURE UPDATE_TRANS_BY_NAME(
    var_FName IN TRANSACTION.FIRST_NAME%type,
    var_LName IN TRANSACTION.LAST_NAME%type,
    var_DOB IN TRANSACTION.DOB%type,
    var_PolNum IN TRANSACTION.POLICY_NUMBER%type,
    var_TransStatus IN TRANSACTION.TRANS_STATUS%type,
    var_Comp IN TRANSACTION.COMPANY%type,
    var_LineOfBusiness IN TRANSACTION.LINE_OF_BUSINESS%type,
    var_PlanCode IN TRANSACTION.PLAN_CODE%type,
    var_AppDate IN TRANSACTION.APP_DATE%type,
    var_IssueDate IN TRANSACTION.ISSUE_DATE%type,
    var_FaceAmt IN TRANSACTION.FACE_AMT%type,
    var_PolicyStatus IN TRANSACTION.POLICY_STATUS%type,
    var_PaidAmt IN TRANSACTION.PAID_AMT%type,
    var_Return OUT VARCHAR2)
  IS
  BEGIN
    UPDATE TRANSACTION
    SET
      POLICY_NUMBER = var_PolNum,
      TRANS_STATUS = var_TransStatus,
      COMPANY = var_Comp,
      LINE_OF_BUSINESS = var_LineOfBusiness,
      PLAN_CODE = var_PlanCode,
      APP_DATE = var_AppDate,
      ISSUE_DATE = var_IssueDate,
      FACE_AMT = var_FaceAmt,
      POLICY_STATUS = var_PolicyStatus,
      PAID_AMT = var_PaidAmt
    WHERE FIRST_NAME = var_FName
      AND LAST_NAME = var_LName
      AND DOB = var_DOB
      AND TRANS_STATUS = 'R'
      AND REASON_FOR_REVIEW = 'No Policy Match';
      commit;
      var_Return := 'PASS';
    EXCEPTION
    WHEN OTHERS THEN
      var_Return := 'FAIL';
  END UPDATE_TRANS_BY_NAME;
END trans_data;

Строка обновляется при удалении строки "AND DOB = var_DOB«в процедуре.Я попытался изменить определение переменной на VARCHAR и использовать «AND DOB = to_date (var_DOB, 'DD-MON-YY')», но безуспешно.Я также попытался «И TRUNC (DOB = var_DOB)», но это также не сработало.

Вот код PHP.Я уже проверил, что все передаваемые параметры имеют значения и правильно отформатированы для типов данных базы данных.Я удалил код, который выполняет предыдущий запрос, который заполняет некоторые связанные переменные, чтобы вырезать то, что работает.

function matchWSPolicy($policy, $trans, $status, $amount){

    include("../includes/DBConn.php");


    if ($Policy == ""){
        $message = 'Policy number does not match!';
        return $message;
    }

    $stmt = OCI_Parse($c,"begin ucs.trans_data.UPDATE_TRANS_BY_NAME(:var_FName, :var_LName, :var_DOB, :var_PolNum, 
        :var_TransStatus, :var_Comp, :var_LineOfBusiness, :var_PlanCode, :var_AppDate, :var_IssueDate, :var_FaceAmt, 
        :var_PolicyStatus, :var_PaidAmt, :var_Return); end;"); 
    OCI_BIND_BY_NAME($stmt,":var_FName",$FName);
    OCI_BIND_BY_NAME($stmt,":var_LName",$LName);
    OCI_BIND_BY_NAME($stmt,":var_DOB",$DOB);
    }
    else {
        $message = 'Policy matched, but a valid SSN or (first name, last name, date of birth) was not returned from the WS database';
}   

    OCI_Bind_By_Name($stmt,":var_PolNum",$Policy);
    OCI_Bind_By_Name($stmt,":var_TransStatus",$status); 
    OCI_Bind_By_Name($stmt,":var_Comp",$ComCode); 
    OCI_Bind_By_Name($stmt,":var_LineOfBusiness",$LineOfBusiness); 
    OCI_Bind_By_Name($stmt,":var_PlanCode",$Plan); 
    OCI_Bind_By_Name($stmt,":var_AppDate",$AppDate); 
    OCI_Bind_By_Name($stmt,":var_IssueDate",$IssueDate); 
    OCI_Bind_By_Name($stmt,":var_FaceAmt",$FaceAmount); 
    OCI_Bind_By_Name($stmt,":var_PolicyStatus",$PolStatus); 
    OCI_Bind_By_Name($stmt,":var_PaidAmt",$amount); 
    OCI_Bind_By_Name($stmt,":var_Return",$return, 4); 

    if ($message == ''){
        oci_execute($stmt);
        oci_commit($c);
    }
    else{
        $message = 'Record not successfully updated.';
    }
    return $message;
}

Любые предложения будут с благодарностью.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2012

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

AND to_date(DOB, 'DD-MON-YY') = to_date(var_DOB, 'DD-MON-YY')

0 голосов
/ 25 декабря 2011

Оператор UPDATE, который влияет на ноль строк, все еще будет успешным, поскольку не вызвал исключение .Так что вы можете захотеть проверить на SQL%ROWCOUNT = 0 или SQL%NOTFOUND и выбросить свое собственное пользовательское исключение для имитации сбоя.

Что касается того, почему не обновляются строки, объяснение довольно простое.Вы говорите себе:

'Строка обновляется, когда я удаляю строку «AND DOB = var_DOB» в процедуре.'

Итак, ясно, что строк нетв таблице , которые соответствуют дате рождения, а также другим критериям.Видимо, вы думаете, что это не так, но я боюсь, что это так.Таким образом, либо база данных не содержит точных данных, которые вы думаете, либо ваш PHP не передает точных значений, которые вы считаете нужными.Только вы можете узнать, какая опция применима.

Возможно, маска формата скрывает источник вашей проблемы.Например, вы протестировали формат даты «DD-MON-YY».Что происходит, когда вы явно указываете столетие, то есть «ДД-МОН-ГГГГ»?Какие значения для века имеет ваша таблица?

...