在 Oracle 程序中,如何定义局部变量并在 DECLARE 块之后使用它?

Posted

技术标签:

【中文标题】在 Oracle 程序中,如何定义局部变量并在 DECLARE 块之后使用它?【英文标题】:In Oracle procedure, how to define local variable and use it after DECLARE block? 【发布时间】:2019-05-08 10:28:15 【问题描述】:

我想创建一个如下所示的存储过程

create or replace PROCEDURE AAA
(
  cv_1 IN OUT SYS_REFCURSOR
)
as
BEGIN

  DECLARE ord_t VARCHAR2(20);
  begin
  SELECT order_type into ord_t from BT;
  dbms_output.Put_line(ord_t);
  end;

  if ord_t = 'xxx' THEN
      open cv_1 for
      select * from BA;
  else
      open cv_1 for
      select * from BB;
  END if;

END;

但是有错误说 ord_t 必须声明。我该如何正确地写这个? proc 的目的是根据 ord_t 的值从 BA 或 BB 返回结果。

【问题讨论】:

【参考方案1】:

您需要在应该使用它的 BEGIN-tag 之前声明变量

create or replace PROCEDURE AAA(cv_1 IN OUT SYS_REFCURSOR)
as
  ord_t VARCHAR2(20);
BEGIN
  SELECT order_type into ord_t from BT;
  dbms_output.Put_line(ord_t);

  if ord_t = 'xxx' THEN
      open cv_1 for
      select * from BA;
  else
      open cv_1 for
      select * from BB;
  END if;

END;

在过程中,CREATE OR REPLACE PROCEDURE name(params) AS 替换块的DECLARE。因此,这里不需要它。

块的定义是

DECLARE or CREATE FUNCTION/PROCEDURE
  (variables in block)
BEGIN
  (code using variables)
END

例子:

declare
  myvar number(1);
begin
  --begin scope of myvar--
  select 1 into myvar from dual;
  --end scope of myvar--
end;

create procedure myproc (var1 in number)
as
  myvarouter number(1);
begin
  --begin scope myvarouter--
  declare
    myvarinner number(1);
  begin
    --begin scope myvarinner--
    select 1 into myvarinner from dual;
    select 1 into myvarouter from dual;
    --end scope myvarinner--
  end;
  select 1 into myvarouter from dual;
  --end scope myvarouter--
end;

另一个相同内容的问题也可以找here

【讨论】:

你的 sql 开发者版本是多少?我的是 4.2,我得到编译错误:错误(2,1):PLS-00103:在期望以下之一时遇到符号“DECLARE”:begin function pragma procedure subtype type current cursor delete 存在先前的外部语言符号“begin”被替换为“DECLARE”以继续。 @Sheen 对不起,我的错。我犯了一个复制粘贴错误。我还添加了一个解释,标题 create procedure/function 替换了声明语句

以上是关于在 Oracle 程序中,如何定义局部变量并在 DECLARE 块之后使用它?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 包中定义全局变量

如何从 TempTable 中检索值并在局部变量中设置该值

3. 在C语言程序中,在函数内部定义的变量称为全局变量。

如何在 Razor 中声明局部变量?

如何在动态 sql (ORACLE PLSQL) 中获取局部临时变量中的计数 (*) 值

C_局部变量&全局变量