这是我的代码:
--this section creates/replaces the C_PND Procedure
--and passes 2variables
create or replace PROCEDURE C_PND
(
p_whse in varchar2,
p_RC OUT INT
)
--No clue what we're doing here as there is no DECLARE
as
cv SYS_REFCURSOR; -- cursor variable
v_pull_zone locn_hdr.pull_zone%TYPE;
v_active varchar2(1);
v_low_wm number(3);
v_high_wm number(3);
v_lock_code resv_locn_hdr.locn_putaway_lock%TYPE;
--initializes this variable
BEGIN
p_RC := 0;
--setting values of the the CV
OPEN cv FOR
select code_id,
nvl(trim(substr(sc.misc_flags,1,1)),'N') v_active,
nvl(trim(substr(sc.misc_flags,2,3)),'100') high_wm,
nvl(trim(substr(sc.misc_flags,5,3)),'0') low_wm,
trim(substr(sc.misc_flags,8,2)) lock_code
from sys_code sc
where sc.rec_type = 'C'
and sc.code_type = 'PND';
--inputting the CV into these variables
LOOP
FETCH cv INTO v_pull_zone, v_active, v_high_wm, v_low_wm, v_lock_code;
EXIT WHEN cv%NOTFOUND;
............
............
............
我认为我理解其中的大部分内容但我的问题是在as之后的五行(代码片段的第6-11行)。我的印象是,无论何时在PL SQL中使用变量,都必须对其进行DECLARE。即使您正在使用游标变量。
我错了吗?或者是否不需要将DECLARE变量用于CV?我还包括一些注释(以 - 开头),显示我认为SQL正在做什么。
答案 0 :(得分:3)
你是对的。您必须在匿名块中使用DECLARE声明变量,如:
DECLARE
...
BEGIN
...
END;
您的代码是一个过程,而
之后隐含了DECLARECREATE OR REPLACE xxx as
(implicit DECLARE)
BEGIN
...
END;