oracle forms builder pl/sql - 访问从其他列派生的列

Posted

技术标签:

【中文标题】oracle forms builder pl/sql - 访问从其他列派生的列【英文标题】:oracle forms builder pl/sql - access a column that is dervied from other columns 【发布时间】:2013-07-26 22:13:24 【问题描述】:

我的数据库中有一个视图,其中有一堆从数据库中的其他信息派生的字段,这就是视图的定义方式:

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;

【问题讨论】:

什么是:PATIENT_BLOCK 这是一个表单生成器数据块。所以 :PATIENT_BLOCK.MRN_FIELD 是我的 oracle 表单上的一个文本字段,但这不是问题行,问题行是这样的:“:PATIENT_BLOCK.BALANCCE_OWING := var_accttuple.balance;” 您表单上的字段是否命名为BALANCE_OWING 而不是代码中的BALACNCE_OWING?我之所以问,是因为“平衡”这个词在其他地方似乎拼写正确,可能是这里的错字…… derp derp derp.. 是的,就是这样.. 还值得注意的是,它不喜欢派生属性的属性名称平衡.. 我不得不将它括在引号中,如下所示:var_accttuple ."平衡"; 最好避免使用双引号作为标识符,例如"balance" 除非在非常特殊的情况下 - 总体上让事情变得更容易。 【参考方案1】:

您的视图patient_account_view 的列与表patient_account 的列不完全匹配,但在您的代码中,您有:

var_accttuple patient_account%ROWTYPE;

这意味着当你运行这个时:

SELECT * INTO var_accttuple from patient_account_view ...

您尚未指定哪些列映射到哪些记录属性,因此 Oracle 要求列列表完全匹配。

在这种情况下,我希望您可能想要更改变量的定义,例如

var_accttuple patient_account_view%ROWTYPE;

旁注

由于您只使用视图中的一个属性,您可以将代码简化如下:

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

你不再需要var_accttuple

【讨论】:

以上是关于oracle forms builder pl/sql - 访问从其他列派生的列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Forms Builder:无法执行查询

Oracle Form Builder:CREATE_GROUP Built-in

PL/SQL 和 Oracle Forms Builder

oracle forms builder pl/sql - 访问从其他列派生的列

使用复选框在父表中搜索 (Oracle Forms Builder)

刚接触ORACLE FORM BUILDER ,请教一个基本的问题,新建了一个堆叠画布,怎么把它显示在主画布上。