PL/SQL - 声明带有由其他游标填充的表的游标时出错
Posted
技术标签:
【中文标题】PL/SQL - 声明带有由其他游标填充的表的游标时出错【英文标题】:PL/SQL - Error when declaring a cursor with tables filled by other cursors 【发布时间】:2020-06-26 13:03:16 【问题描述】:我在尝试创建使用在调用其他两个游标后填充的表的游标时遇到问题,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;
【问题讨论】:
【参考方案1】:“有人有什么建议吗?也许是更简单、更有效的方法?”
为什么不写一个 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 针对连接进行了优化。尽可能在普通旧 SQL 中执行所有操作会更有效。 (在某些极端情况下,我们可能会选择在 PL/SQL 中执行某些操作,即使我们可以在 SQL 中执行此操作,但这里不是。)
【讨论】:
【参考方案2】:不能将游标名作为最后一个游标中的表名(cursorAV
)。
但我认为您可以使用单个查询来实现这一点,如下所示:
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';
【讨论】:
以上是关于PL/SQL - 声明带有由其他游标填充的表的游标时出错的主要内容,如果未能解决你的问题,请参考以下文章
创建带有 2 个游标、一个参数并从表中给出结果的 PL/SQL 脚本?
如何使用 pl/sql 中的游标将多列数据插入包含单列的表中?