0

データベース内の他の情報から派生した一連のフィールドを持つビューがデータベースにあり、これがビューの定義方法です。

create view patient_account_view AS 
  select patient.p_mrn,
         p_fname,
         p_lname,
         ammount_paid,
         quantity*item_cost + repeats*item_cost  "ammount_owing", 
         (quantity*item_cost + repeats*item_cost) - ammount_paid "balance"
    from patient_account,
         patient,
         diagnosis,
         prescribed_treatment,
         items_used,
         item,
         perscription
    where patient.p_mrn = diagnosis.p_mrn AND
          patient_account.p_mrn = patient.p_mrn AND
          diagnosis.prescribed_treatment_id = prescribed_treatment.prescribed_treatment_id AND 
          prescribed_treatment.prescribed_treatment_id = perscription.prescribed_treatment_id AND
          items_used.ptreatment_id = prescribed_treatment.prescribed_treatment_id AND
          items_used.item_number = item.item_number;

pl/sql を使用してビュー内の情報にアクセスし、フォームに貼り付けたいのですが、「バインド変数が正しくありません」というエラーが発生します。そこに保存されている情報を再計算することなく、この種の属性にアクセスするにはどうすればよいですか?

問題のあるplsqlは次のとおりです。

DECLARE
    pmrn patient.p_mrn%TYPE;
    var_ptuple patient%ROWTYPE;
    var_accttuple patient_account%ROWTYPE;
BEGIN
    pmrn := :PATIENT_BLOCK.MRN_FIELD;
    SELECT * INTO var_ptuple from patient WHERE patient.p_mrn = pmrn;
    SELECT * INTO var_accttuple from patient_account_view WHERE patient_account_view.p_mrn = pmrn;
    :PATIENT_BLOCK.FNAME := var_ptuple.p_fname;
    :PATIENT_BLOCK.LNAME := var_ptuple.p_lname;
    :PATIENT_BLOCK.BALACNCE_OWING := var_accttuple.balance;
END;
4

1 に答える 1

0

ビューpatient_account_viewの列は table の列と正確には一致しませんpatient_accountが、コードには次のものがあります。

var_accttuple patient_account%ROWTYPE;

これは、これを実行すると次のことを意味します。

SELECT * INTO var_accttuple from patient_account_view ...

どの列がどのレコード属性にマップされるかを指定していないため、Oracle では列リストが正確に一致する必要があります。

この場合、おそらく変数の定義を変更したいと思うでしょう。

var_accttuple patient_account_view%ROWTYPE;

サイドノート

ビューから 1 つの属性のみを使用しているため、次のようにコードを簡略化できます。

SELECT balance INTO :PATIENT_BLOCK.BALACNCE_OWING
from patient_account_view WHERE patient_account_view.p_mrn = pmrn;

そして、もう必要ありませんvar_accttuple

于 2013-07-27T09:48:24.987 に答える