Plsql 嵌套块中的PL/SQL变量范围

Plsql 嵌套块中的PL/SQL变量范围,plsql,Plsql,我需要运行一些SQL块来测试它们,是否有在线应用程序可以插入代码并查看它触发的结果? 谢谢! 更具体的问题如下: <<block1>> DECLARE var NUMBER; BEGIN var := 3; DBMS_OUTPUT.PUT_LINE(var); <<block2>> DECLARE var NUMBER; BEGIN var := 200; DBMS_OUTPUT.PUT_LINE(block1.var

我需要运行一些SQL块来测试它们,是否有在线应用程序可以插入代码并查看它触发的结果? 谢谢! 更具体的问题如下:

<<block1>>
DECLARE 
var NUMBER;
BEGIN
var := 3;
DBMS_OUTPUT.PUT_LINE(var);

  <<block2>>
  DECLARE 
  var NUMBER;
  BEGIN
  var := 200;
  DBMS_OUTPUT.PUT_LINE(block1.var);
  END block2;
DBMS_OUTPUT.PUT_LINE(var);
END block1;
是输出: 3. 3. 二百

还是: 3. 3. 3. 我读到变量的值是在最近的块中接收到的值,那么第二个答案是正确的吗?如果有可能的话,我想在网上的某个地方测试一下。 还有,命名块的正确方法是什么

稍后编辑: 我尝试使用SQL FIDLE执行此操作,但收到一条“请构建架构”错误消息:
非常感谢你,戴夫!知道为什么会这样吗

create table log_table
( message varchar2(200)
)


<<block1>>
DECLARE 
var NUMBER;
BEGIN
var := 3;

insert into log_table(message) values (var)
select * from log_table

  <<block2>>
  DECLARE 
  var NUMBER;
  BEGIN
  var := 200;
  insert into log_table(message) values (block1.var || ' 2nd') 
  select * from log_table
  END block2;
insert into log_table(message) values (var || ' 3rd') 
select * from log_table
END block1;

回答你的三个问题

您可以将SQL FIDLE与Oracle 11g R2配合使用:。但是,这不允许您使用dbms_输出。您必须在表中插入/选择才能查看PL/SQL脚本的结果

答案是3。内部块结束后,变量不再存在/具有作用域。您无法进一步访问它们

块命名是正确的,但是,您不需要命名块,它们可以是完全匿名的

编辑:

所以在玩了一点SQLFiddle之后,它似乎实际上不支持命名块,尽管我有一个实际的Oracle数据库来证实我前面所说的

但是,您基本上可以使用存储过程和内部过程来演示变量范围的工作方式,顺便说一句,这是两个非常重要的PL/SQL特性

在此之前,我注意到您的代码存在三个问题:

您需要用分号终止insert语句。 您需要在第三次插入后提交事务。 在PL/SQL中,您不能简单地执行select语句并获得结果,您需要选择某个变量。这将是一个简单的更改,但是因为我们不能使用dbms_输出来查看变量,所以它对我们没有帮助。而是先插入,然后提交,然后从表中选择。 在SQL FIDLE的左侧窗格中,将查询终止符设置为“/”,然后粘贴到下面的“构建架构”:

create table log_table
( message varchar2(200)
)
//

create or replace procedure proc1 as
var NUMBER;

   procedure proc2 as 
      var number;
   begin
      var := 200;
      insert into log_table(message) values (proc1.var || ' 2nd'); 
   end;

begin
   var := 3;

   insert into log_table(message) values (var || ' 1st');

   proc2;

   insert into log_table(message) values (var || ' 3rd');

   commit;

end;
//

begin
proc1;
end;
//
然后在右侧面板中运行以下SQL:

select * from log_table

您可以看到proc2.var在proc2之外没有作用域。此外,如果您明确尝试在proc2之外使用proc2.var,您会提出一个异常,因为它超出了范围。

回答您的三个问题

您可以将SQL FIDLE与Oracle 11g R2配合使用:。但是,这不允许您使用dbms_输出。您必须在表中插入/选择才能查看PL/SQL脚本的结果

答案是3。内部块结束后,变量不再存在/具有作用域。您无法进一步访问它们

块命名是正确的,但是,您不需要命名块,它们可以是完全匿名的

编辑:

所以在玩了一点SQLFiddle之后,它似乎实际上不支持命名块,尽管我有一个实际的Oracle数据库来证实我前面所说的

但是,您基本上可以使用存储过程和内部过程来演示变量范围的工作方式,顺便说一句,这是两个非常重要的PL/SQL特性

在此之前,我注意到您的代码存在三个问题:

您需要用分号终止insert语句。 您需要在第三次插入后提交事务。 在PL/SQL中,您不能简单地执行select语句并获得结果,您需要选择某个变量。这将是一个简单的更改,但是因为我们不能使用dbms_输出来查看变量,所以它对我们没有帮助。而是先插入,然后提交,然后从表中选择。 在SQL FIDLE的左侧窗格中,将查询终止符设置为“/”,然后粘贴到下面的“构建架构”:

create table log_table
( message varchar2(200)
)
//

create or replace procedure proc1 as
var NUMBER;

   procedure proc2 as 
      var number;
   begin
      var := 200;
      insert into log_table(message) values (proc1.var || ' 2nd'); 
   end;

begin
   var := 3;

   insert into log_table(message) values (var || ' 1st');

   proc2;

   insert into log_table(message) values (var || ' 3rd');

   commit;

end;
//

begin
proc1;
end;
//
然后在右侧面板中运行以下SQL:

select * from log_table

您可以看到proc2.var在proc2之外没有作用域。此外,如果您要明确尝试在proc2之外使用proc2.var,则会引发异常,因为它超出了范围。

非常感谢您,Dave!知道为什么SQLFiddle会抛出错误消息吗?请构建模式?我编辑了我的原始问题,以展示我尝试使用Fiddle的代码。嗨,Samy,我刚刚编辑了我的帖子,为您提供了有关SQL Fiddle和变量范围的更多指导。希望有帮助:D非常感谢你,戴夫!知道为什么SQLFiddle会抛出错误消息吗?请构建模式?我编辑了我的原始问题,以展示我尝试使用Fiddle的代码。嗨,Samy,我刚刚编辑了我的帖子,为您提供了有关SQL Fiddle和变量范围的更多指导。希望能有帮助:D