【问题标题】:Executing stored procedure based on a variable conditions基于可变条件执行存储过程
【发布时间】:2019-04-26 23:54:13
【问题描述】:

环境:Oracle SQL Developer

场景:比较来自 2 个不同表的度量值并在满足条件时运行存储过程

试图将每个表的度量存储在一个变量中并比较变量并执行存储过程

--For Variable1
Declare 
  Variable1 int;
Begin 
  select sum(sales) from table1 into Variable1;
end;

--For Variable2
Declare 
  Variable2 int;
Begin 
  select sum(sales) from table2 into Variable2;
end

--Creating stored procedure

CREATE OR REPLACE PROCEDURE Proc1 as 
BEGIN
  IF (Variable1=Variable2) THEN
    PROC2()
  END IF;    
END Proc1;
  1. 我无法将值存储在 Variable1Variable2
  2. 我无法使用条件运行存储过程

【问题讨论】:

  • 你应该在存储过程 Proc1 中编写所有内容

标签: oracle stored-procedures plsql


【解决方案1】:

正确的语法是select ... into ... from ..

如果你想在proc1 中使用你的变量,你应该在那个过程中定义它们。

CREATE OR REPLACE PROCEDURE Proc1 as 
  Variable1 int;
  Variable2 int;    
BEGIN
  select sum(sales) into Variable1 from table1 ;
  select sum(sales) into Variable2 from table2 ;

  IF (Variable1=Variable2) THEN
    PROC2();
  END IF;
END Proc1;    

或者您可以将值作为参数传递:

CREATE OR REPLACE PROCEDURE Proc1(Variable1 in int, Variable2 in int) as 

BEGIN
  -- Using Parameter values   
  IF (Variable1=Variable2) THEN
    PROC2();
  END IF;

END Proc1;
/

Declare
  Variable1 int;
  Variable2 int;
Begin 
  select sum(sales)  into Variable1 from table1;
  select sum(sales)  into Variable2 from table2;
  -- pass values into the procedure
  proc1( Variable1,Variable2 );   
END;

/

【讨论】:

    【解决方案2】:

    您的变量仅在每个 PL/SQL 块的持续时间内有效。 所以如果你想比较 variable1 和 variable2 你必须把它们放在同一个 PL/SQL 块中。 那会给你:

    Declare
     Variable1 int;
     Variable2 int;
    Begin 
    select sum(sales) into Variable1 from table1;
    select sum(sales) into Variable2 from table2;
    IF Variable1 = Variable2 THEN
      PROC2;
    END IF;
    END;
    /
    

    并不是所有这些代码都可以在匿名 PL/SQL 块中。 如果您愿意,也可以将其存储在过程中。

    【讨论】:

    • 我在“hotfix”回答后更新,确实必须在 FROM 之前放置 INTO 关键字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2018-02-09
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多