2011-12-23 5 views
1

PHPを使用してOracleストアドプロシージャを実行するprobemがあります。私は成功した戻り値を取得していますが、プロシージャは行を更新していません。日付基準を持つOracle Procが実行されますが、更新されません。

プロシージャの定義は次のとおりです。

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')"を使用して成功しませんでした。私も "AND 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; 
} 

ご意見をいただければ幸いです。

ありがとうございます。

+0

私も試してみました "とTRUNC(DOB = var_DOB)" - しかし、あなたはしてみてくださいでした: "AND TRUNC(DOB)= TO_DATE(var_DOB、 'DD-MON-YY')"? – Ollie

+0

はい。それも私にとってはうまくいきませんでした。 – MikeL

+0

DOB varをダンプするとどうなりますか?比較値がDOB varの日付の形式とまったく同じであることを確認してください。少なくとも、あなたは問題が日付の比較にあることを知っています。これを試すhttp://www.dba-oracle.com/f_to_date.htm – jamesTheProgrammer

答えて

0

私はそれが1年以上経っていることを知っていますが、私はこのプロジェクトに戻らなければなりませんでした。答えは、データベースの値がすでに日付だったのに、両方の値を日付に変換する必要がありました。

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

0

は例外を発生させていないため、ゼロ行に影響するUPDATEステートメントはまだ成功しています。したがって、SQL%ROWCOUNT = 0またはSQL%NOTFOUNDをテストし、エラーをシミュレートするために独自のユーザー定義例外を実行することをお勧めします。

なぜ行が更新されないのかについては、説明は非常に簡単です。

プロシージャで行「AND DOB = var_DOB」を削除すると行が更新されます。

だから、はっきりと生年月日を加えたその他の条件に一致するテーブルで行がありません。どうやらあなたはそれが事実ではないと思うが、私は恐れている。したがって、データベースには正確なデータが格納されていないか、またはあなたのPHPが正確な値を渡していないと考えられます。あなたのみが、どのオプションが適用されるかを知る立場にあります。

おそらく、フォーマットマスクはあなたのトラブルの原因を隠しています。たとえば、「DD-MON-YY」の日付書式をテストしました。明示的に世紀、すなわち「DD-MON-YYYY」を含めるとどうなりますか?あなたのテーブルには何世紀の価値がありますか?

関連する問題