开始后声明光标以使用它

时间:2018-08-23 01:57:14

标签: oracle plsql

我有一个项目,在该项目中,我必须检查某些客户是否可以从公司出售多少产品。客户可以有很多公司,当客户或产品不存在时,我也必须拒绝。

我在一张桌子上有客户和公司,然后在另一张桌子上有公司和产品。我正在尝试创建游标来管理“公司产品”表,只是客户可以从中购买的公司,但是当我声明游标时说“它不是游标”时,我尝试了%rowtype,也是%type,两者都不起作用。有谁知道我该如何解决?

CREATE OR REPLACE PROCEDURE Transaccion
IS
   my_cantidaRechazada   NUMBER;

   CURSOR peti
   IS
        SELECT idCliente, idProducto, cantidadPedido
          FROM TABLAS_COMP.peticiones
      ORDER BY idCliente ASC;

   CURSOR empresaCliente
   IS
        SELECT *
          FROM TABLAS_CL.empresacliente
      ORDER BY tablas_cl.empresacliente.empresa;

   empC                  empresaCliente%ROWTYPE;

   CURSOR empresaProducto (vempresa NUMBER)
   IS
        SELECT *
          FROM TABLAS_PRO.empresaproducto
         WHERE empresa = vempresa
      ORDER BY tablas_pro.empresaproducto.empresa ASC;

   empP                  empresaProducto%ROWTYPE;
BEGIN
   FOR cont IN peti
   LOOP
      IF existecliente (cont.idCliente) = 0
      THEN
         my_cantidaRechazada := cont.cantidadPedido;

         INSERT INTO TABLAS_COMP.rechazados
              VALUES (cont.idCliente,
                      cont.idProducto,
                      cont.cantidadPedido,
                      my_cantidaRechazada);
      ELSIF existeproducto (cont.idProducto) = 0
      THEN
         my_cantidaRechazada := cont.cantidadPedido;

         INSERT INTO TABLAS_COMP.RECHAZADOS
              VALUES (cont.idCliente,
                      cont.idProducto,
                      cont.cantidadPedido,
                      my_cantidaRechazada);
      END IF;

        SELECT *
          INTO empC
          FROM TABLAS_CL.empresacliente
         WHERE Cliente = cont.idCliente
      ORDER BY empresa ASC;


      FOR empP IN empC
      LOOP -- (here's where the error is showed, it says "empC it's not a cursor")
         SELECT *
           INTO empP
           FROM TABLAS_PRO.empresaproducto
          WHERE Empresa = empC.Empresa;
      END LOOP;
   END LOOP;
END Transaccion;

戴维,谢谢。

1 个答案:

答案 0 :(得分:1)

如果您准确地指定了Oracle错误 以及ORA-XXXXX错误代码,将会很有帮助。用您的话说可能会含糊不清。

无论如何:您所说的确实是错误的。应该是

-- wrong: for empP in empC loop
for empP in empresaProducto loop
   ...
end loop;

因为empP被声明为empresaProducto游标变量。

尽管,您放入循环的SELECT是没有意义的-您已经有了empP,所以-为什么要再次插入循环中?考虑一下。