gpt4 book ai didi

oracle - Oracle中触发器的BEGIN语句后可以声明CURSOR吗?

转载 作者:行者123 更新时间:2023-12-02 17:20:46 25 4
gpt4 key购买 nike

我需要根据如下条件在触发器中的 BEGIN 语句之后创建一个 CURSOR:

IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN

DECLARE CURSOR cur_list IS
SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWF_ID = :NEW.DWF_ID;

END IF;

当我编译时,我收到此错误:

Error(99,5): PLS-00103: Encountered the symbol "END" when expecting one of the following:
begin function pragma procedure subtype type
current cursor delete exists prior

Oracle中如何在触发器的BEGIN语句之后声明游标?

最佳答案

DECLARE 是 PL/SQL block 的开始。 block 包含一个可选的 DECLARE 部分,后跟一个 BEGIN 部​​分、一个可选的 EXCEPTION 部分,最后是一个 END。

这里有一个嵌套 block 。 Oracle 希望您遵循 BEGIN 和 END。像这样:

IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN

DECLARE CURSOR cur_list IS
SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWF_ID = :NEW.DWF_ID;

begin
-- some code here

end;

END IF;

也就是说,您必须在 DECLARE 语句定义的 block 中编写使用 Cursor 的代码。这是因为 PL/SQL 作用域意味着不能在声明变量的 block 之外引用变量。

所以问题是,为什么要在嵌套 block 中声明这个游标?什么时候不只是在触发器主体的顶部声明它?

关于oracle - Oracle中触发器的BEGIN语句后可以声明CURSOR吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51889318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com