为啥在 Oracle 表单中(基于过程)查询不返回任何值?

Posted

技术标签:

【中文标题】为啥在 Oracle 表单中(基于过程)查询不返回任何值?【英文标题】:Why in Oracle forms (based on procedure) query does not return any values?为什么在 Oracle 表单中(基于过程)查询不返回任何值? 【发布时间】:2019-02-22 09:29:22 【问题描述】:

我已经使用数据块向导在 oracle 表单中创建了一个数据块,但是查询不会填充表单。即使游标返回值并进入查询过程中的循环:

查询程序代码如下:

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;

这里是表单触发Query-Procedure的代码:

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;

【问题讨论】:

【参考方案1】:

首先,确保PD_PDT_SCHEDULE_TYPES_QUERY 确实做了一些事情 - 在 SQL*Plus(或 SQL Developer 或您使用的任何其他工具)中对其进行测试。

QUERY-PROCEDURE 触发器由向导创建;它是原样,你不需要做任何事情。 Forms 说你无论如何都不应该修改它。

为了使其工作,您应该编辑数据块的属性 - 转到调色板,导航到“数据库”部分并打开 查询数据源列 - 在那里,您应该输入 ALL过程返回的列,即pst_codepst_prty 等,以及它们的数据类型、长度、精度……取决于数据类型本身。

另外,修改查询数据源参数属性。由于您的过程不接受任何IN 参数,它只是一个参数(TABLE 类型,写下它的名称,模式是IN OUT)。如果你向过程传递了一些参数,你也会把它们放在这里。

我想就是这样。

【讨论】:

是的,我已经在 PLSQL 开发人员中进行了测试。它工作正常,我没有将任何参数传递给查询,因为我需要完整的表。问题是我在表单中的数据块中添加了一个额外的列,并且没有在数据块向导中按下刷新按钮。出于这个原因,数据块向导没有选择我新添加的列。 好的,很高兴你修好了!感谢您告知我们。

以上是关于为啥在 Oracle 表单中(基于过程)查询不返回任何值?的主要内容,如果未能解决你的问题,请参考以下文章

平时使用oracle时,为啥会锁表

什么基于可空表单字段的访问查询条件将返回我需要的内容?

oracle 如何返回多条记录

为啥查询不返回值?

oracle 存储过程,数据处理并返回结果集问题

在oracle数据库表中没有添加rowid字段为啥会出现