为什么在 Oracle 表单(基于过程)中查询没有 return 任何值?
Why in Oracle forms (based on procedure) query does not return any values?
我使用数据块向导在 oracle 表单中创建了一个数据块,但是查询没有填充该表单。即使游标 returns 值并进入查询过程中的循环:
查询程序代码如下:
PROCEDURE PD_PDT_SCHEDULE_TYPES_QUERY(par_pd_pdt_schedule_types_tbl IN OUT gt_pd_pdt_schedule_types_tbl) IS
lc_err_msg VARCHAR2(2000);
lc_add_rec VARCHAR2(1);
lc_search_ok VARCHAR2(1);
CURSOR c_pd_pdt_schedule_types IS
SELECT pst_code,
pst_prty,
pst_mnemo,
pst_name,
pst_crt_mandatory,
pst_pdt_mnemo,
pst_type,
pst_purpose,
pst_purpose_det,
pst_ref_mnemo,
pst_hidden,
pst_ref_show,
pst_payment_show
FROM s_pd_pdt_schedule_types where pst_pdt_mnemo = 'SOME_PRODUCT';
ln_idx NUMBER := 1;
BEGIN
FOR i IN c_pd_pdt_schedule_types
LOOP
par_pd_pdt_schedule_types_tbl(ln_idx) := i;
ln_idx := ln_idx + 1;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
lc_err_msg := 'FRL_184.PD_PDT_SCHEDULE_TYPES_QUERY error: ' || SQLERRM;
RAISE_APPLICATION_ERROR(-20555, SUBSTR(lc_err_msg, 1, 2000));
END PD_PDT_SCHEDULE_TYPES_QUERY;
这里是表单触发查询过程的代码:
DECLARE
bk_data FRL_184.GT_PD_PDT_SCHEDULE_TYPES_TBL;
BEGIN
frl_184.PD_PDT_SCHEDULE_TYPES_QUERY(bk_data);
PLSQL_TABLE.POPULATE_BLOCK(bk_data, 'S_PD_PDT_SCHEDULE_TYPES');
END;
首先,确保 PD_PDT_SCHEDULE_TYPES_QUERY
实际上 做了一些事情 - 在 SQL*Plus(或 SQL Developer 或您使用的任何其他工具)。
QUERY-PROCEDURE
触发器由向导创建; 原样,您无需为此做任何事情。 Forms 说你无论如何都不应该修改它。
为了让它工作,您应该编辑数据块的属性 - 转到面板,导航到 "Database" 部分并打开 查询数据源列 -在那里,您应该输入过程返回的所有列,即 pst_code
、pst_prty
等,以及它们的数据类型、长度、精度……取决于数据类型本身。
另外,修改查询数据源参数 属性。由于你的过程不接受任何IN
参数,它只是一个参数(TABLE
类型,写它的名字,模式是IN OUT
)。如果您向过程传递了一些参数,您也可以将它们放在这里。
我想就这样吧。
我使用数据块向导在 oracle 表单中创建了一个数据块,但是查询没有填充该表单。即使游标 returns 值并进入查询过程中的循环:
查询程序代码如下:
PROCEDURE PD_PDT_SCHEDULE_TYPES_QUERY(par_pd_pdt_schedule_types_tbl IN OUT gt_pd_pdt_schedule_types_tbl) IS
lc_err_msg VARCHAR2(2000);
lc_add_rec VARCHAR2(1);
lc_search_ok VARCHAR2(1);
CURSOR c_pd_pdt_schedule_types IS
SELECT pst_code,
pst_prty,
pst_mnemo,
pst_name,
pst_crt_mandatory,
pst_pdt_mnemo,
pst_type,
pst_purpose,
pst_purpose_det,
pst_ref_mnemo,
pst_hidden,
pst_ref_show,
pst_payment_show
FROM s_pd_pdt_schedule_types where pst_pdt_mnemo = 'SOME_PRODUCT';
ln_idx NUMBER := 1;
BEGIN
FOR i IN c_pd_pdt_schedule_types
LOOP
par_pd_pdt_schedule_types_tbl(ln_idx) := i;
ln_idx := ln_idx + 1;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
lc_err_msg := 'FRL_184.PD_PDT_SCHEDULE_TYPES_QUERY error: ' || SQLERRM;
RAISE_APPLICATION_ERROR(-20555, SUBSTR(lc_err_msg, 1, 2000));
END PD_PDT_SCHEDULE_TYPES_QUERY;
这里是表单触发查询过程的代码:
DECLARE
bk_data FRL_184.GT_PD_PDT_SCHEDULE_TYPES_TBL;
BEGIN
frl_184.PD_PDT_SCHEDULE_TYPES_QUERY(bk_data);
PLSQL_TABLE.POPULATE_BLOCK(bk_data, 'S_PD_PDT_SCHEDULE_TYPES');
END;
首先,确保 PD_PDT_SCHEDULE_TYPES_QUERY
实际上 做了一些事情 - 在 SQL*Plus(或 SQL Developer 或您使用的任何其他工具)。
QUERY-PROCEDURE
触发器由向导创建; 原样,您无需为此做任何事情。 Forms 说你无论如何都不应该修改它。
为了让它工作,您应该编辑数据块的属性 - 转到面板,导航到 "Database" 部分并打开 查询数据源列 -在那里,您应该输入过程返回的所有列,即 pst_code
、pst_prty
等,以及它们的数据类型、长度、精度……取决于数据类型本身。
另外,修改查询数据源参数 属性。由于你的过程不接受任何IN
参数,它只是一个参数(TABLE
类型,写它的名字,模式是IN OUT
)。如果您向过程传递了一些参数,您也可以将它们放在这里。
我想就这样吧。