在 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 块之后使用它?的主要内容,如果未能解决你的问题,请参考以下文章