这是做什么的?列出变量而不声明它们?

时间:2015-09-29 20:00:37

标签: sql oracle plsql

这是我的代码:

--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正在做什么。

1 个答案:

答案 0 :(得分:3)

你是对的。您必须在匿名块中使用DECLARE声明变量,如:

DECLARE
...
BEGIN
...
END;

您的代码是一个过程,而

之后隐含了DECLARE
CREATE OR REPLACE xxx as
(implicit DECLARE)

BEGIN

...

END;