oracle形成了许多记录

时间:2018-05-09 14:38:42

标签: sql oracle plsql oracle-sqldeveloper oracleforms

我需要返回主详细信息中表的所有记录,因为我使用触发器WHEN-VALIDATE-ITEM并且我正在使用此代码

DECLARE 
    CURSOR N IS 
          SELECT B.CODIGO_BARRA, B.REFER, B.DESC_PROD, B.CANT, B.PRECIO
          FROM PS62 B
          WHERE B.NRODOCTO = :E.NRO_DOCTO_PEDIDO
          AND B.CODCIA = :E.CODCIA;

BEGIN 
      GO_BLOCK('D');
      FIRST_RECORD;
             FOR I IN N  LOOP
                      :D.CODIGO_BARRA := I.CODIGO_BARRA;
                      :D.REFER := I.REFER;
                      :D.DESC_PROD := I.DESC_PROD;
                      :D.CANT := I.CANT;
                      :D.COSTO := I.PRECIO;
        NEXT_RECORD;
    END LOOP;
    COMMIT;
END;

这只是给我一条记录。请帮帮我!

2 个答案:

答案 0 :(得分:3)

这当然不是在Oracle Forms中填充数据块的方法。即使您设法这样做,表单也会考虑 new 这些行,并且 - 如果您尝试保存它们 - 您将获得主要/唯一密钥违规。

您应该使用数据块向导来指导您完成创建主块的过程(通常采用表单布局,显示单个记录)。

然后再次运行向导以创建详细信息块(通常以表格布局显示,显示多个记录)。确保创建这两个块之间的关系。

如果正确创建了这些表(即具有主键以及建立主 - 详细信息关系的外键),表单将自动提供应加入哪些列。

完成向导后,该表单将以各种方式运行 - 您不必编写一行代码。所以,你可以

  • 查询这些表格
    • 查询主人将自动检索其详细信息 ,而不会在您自己的程序单元中写入任何循环
  • 输入新值,
  • 更新或删除现有的。

截至您编写的代码:Barbaros告诉您如何修复它,但它仍无法在WHEN-VALIDATE-ITEM触发器中工作,因为您无法使用受限制的程序(例如{{1其中包含{}或GO_BLOCK}。这并不重要,因为你想做的方式是完全错误的。

答案 1 :(得分:0)

为什么需要COMMIT来返回记录。

目标区块应该被清除(CLEAR_BLOCK(NO_VALIDATE)需要FIRST_RECORD才能在没有任何弹出窗口的情况下执行此目标,

再次使用DECLARE CURSOR N IS SELECT B.CODIGO_BARRA, B.REFER, B.DESC_PROD, B.CANT, B.PRECIO FROM PS62 B WHERE B.NRODOCTO = :E.NRO_DOCTO_PEDIDO AND B.CODCIA = :E.CODCIA; BEGIN GO_BLOCK('D'); CLEAR_BLOCK(NO_VALIDATE); FIRST_RECORD; FOR I IN N LOOP :D.CODIGO_BARRA := I.CODIGO_BARRA; :D.REFER := I.REFER; :D.DESC_PROD := I.DESC_PROD; :D.CANT := I.CANT; :D.COSTO := I.PRECIO; NEXT_RECORD; END LOOP; FIRST_RECORD; END; ,将光标移到返回结尾的记录顶部。

因此,您可以使用以下内容:

import {generateDeps} from './depsGenerator'
//...
generateDeps().then(() => {
    //...
})