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 Form Builder:CREATE_GROUP Built-in
oracle forms builder pl/sql - 访问从其他列派生的列