0

我在尝试创建一个使用在调用其他两个游标后填充的表的游标时遇到问题,Oracle 引发 ORA-00942 异常 - 表或视图不存在。我试图初始化表,但它没有改变任何东西......

这个想法是从一个表中恢复购买价格(tsc.prxtar when tsc.achvte='A)和销售价格(tsc.prxtar when tsc.achvte='V'),将结果存储在两个不同的表中并将它们连接到结束。

有人有什么建议吗?也许是一种更简单、更有效的方法?

提前致谢!

DECLARE

CURSOR cursorA IS
    SELECT pro.codpro as CodeProduit,
            pro.nompro as NomProduit,
            tsc.prxtar as PrixAchat
    FROM pro
    INNER JOIN tsc ON pro.codpro=tsc.codpro
    WHERE tsc.achvte='A';
TYPE tableA IS TABLE OF cursorA%ROWTYPE;
tabA tableA:=tableA();

CURSOR cursorV IS
    SELECT pro.codpro as CodeProduit,
            pro.nompro as NomProduit,
            tsc.prxtar as PrixVente
    FROM pro
    INNER JOIN tsc ON pro.codpro=tsc.codpro
    WHERE tsc.achvte='V';
TYPE tableV IS TABLE OF cursorV%ROWTYPE;
tabV tableV:=tableV();

CURSOR cursorAV IS
    SELECT tabA.CodeProduit,
            tabA.NomProduit,
            tabA.PrixAchat,
            tabV.PrixVente
    FROM tabA
    INNER JOIN tabV ON tabA.CodeProduit=tabV.CodeProduit;
                   -- AND tabA.NomProduit=tabB.NomProduit;
TYPE tableAV IS TABLE OF cursorAV%ROWTYPE;
tableauDesPrix tableAV:=tableAV();

BEGIN
OPEN cursorA;
FETCH cursorA BULK COLLECT INTO tabA;
CLOSE cursorA;

OPEN cursorV;
FETCH cursorV BULK COLLECT INTO tabV;
CLOSE cursorV;

OPEN cursorAV;
FETCH cursorAV BULK COLLECT INTO tableauDesPrix;
CLOSE cursorAV;

END;
4

2 回答 2

0

“有人有什么建议吗?也许是更简单、更有效的方法?”

为什么不编写一个 SELECT 语句将 PRO 连接到 TSC 两次?

SELECT pro.codpro  as CodeProduit,
       pro.nompro  as NomProduit,
       tsca.prxtar as PrixAchat,
       tscv.prxtar as PrixVente
FROM       pro
INNER JOIN tsc tsca ON pro.codpro = tsca.codpro
INNER JOIN tsc tscv ON pro.codpro = tscv.codpro
WHERE tsca.achvte = 'A'
AND   tscv.achvte = 'V';

SQL 针对连接进行了优化。尽可能使用 Plain Old SQL 做所有事情会更有效率。(在某些极端情况下,我们可能会选择在 PL/SQL 中执行某些操作,即使我们可以在 SQL 中执行此操作,但这里不是。)

于 2020-06-26T13:33:20.897 回答
0

You can not use the cursor name as a table name in the last cursor(cursorAV).

But I think you can achieve this using the single query as follows:

SELECT PRO.CODPRO    AS CODEPRODUIT,
       PRO.NOMPRO,
       TSCA.PRXTAR   AS PRIXACHAT,
       TSCV.PRXTAR   AS PRIXVENTE
  FROM PRO
 INNER JOIN TSCA
ON PRO.CODPRO = TSCA.CODPRO
 INNER JOIN TSCV
ON PRO.CODPRO = TSCV.CODPRO
 WHERE TSCA.ACHVTE = 'A'
   AND TSCV.ACHVTE = 'V';
于 2020-06-26T13:31:09.727 回答