在过程中声明变量和select语句

时间:2017-11-14 10:20:11

标签: sql plsql oracle-sqldeveloper

我正在编写一个SQL程序,它应该使用在select语句中存储为局部变量的计算日期。我使用的是Oracle SQL开发人员。我的代码是:

create or replace PROCEDURE 
                                   my_procedure
AS
BEGIN
DECLARE
  l_max_dt  DATE;
BEGIN
 SELECT MAX(TRX_DT)
 INTO   l_max_dt
 FROM   TABLE
 WHERE 1=1;
end;
 select * from TABLE where trx_dt = l_max_dt;
end;

这段代码给了我一个错误:"错误(14,48):PL / SQL:ORA-00904:" L_MAX_DT":无效标识符"当select语句存在时。 如何存储变量以在语句中使用它们?

2 个答案:

答案 0 :(得分:0)

这就是你写Procedure的方法。 Syntaxincorrect。阅读语法Here

CREATE OR REPLACE PROCEDURE my_procedure
AS
   l_max_dt   DATE;
   v_var      TABLE2%ROWTYPE;
BEGIN
   SELECT MAX (TRX_DT)
     INTO l_max_dt
     FROM TABLE1
    WHERE 1 = 1;

   -- Assuming the query will retrun only 1 row. 
   SELECT *
     INTO v_var
     FROM TABLE2
    WHERE trx_dt = l_max_dt;
END;

答案 1 :(得分:0)

您的问题属于范围之一。在您的过程中,您有一个嵌套块,在其中声明l_max_dt变量。一旦代码退出该块,l_max_dt变量就不再在范围内 - 即外部块不知道它的任何内容。

在这个实例中不需要嵌套块 - 你可以在同一个块中完成所有操作,如下所示:

create or replace PROCEDURE my_procedure
AS
  l_max_dt  DATE;
BEGIN
  SELECT MAX(TRX_DT)
  INTO   l_max_dt
  FROM   TABLE
  WHERE 1=1;

--  commented out as this isn't valid syntax; there is a missing INTO clause
--  select *
--  from TABLE where trx_dt = l_max_dt;
END my_procedure;

但是,您可以一举完成查询 - 例如:

select *
from   your_table
where  trx_dt = (select max(trx_dt) from your_table);

有关您程序的几点意见:

  1. 在PL / SQL中,如果使用隐式游标(即将select语句直接放在代码体中),则需要将结果放入其中。您可以将结果批量收集到一个数组中,或者您可以确保在一个记录或相应的标量变量中只收到一行(或NO_DATA_FOUND和TOO_MANY_ROWS的代码错误处理)。
  2. 您不应在过程中使用select * - 而应明确说明要返回的列,因为有人向该表添加列可能会导致您的过程出错。这个“规则”有例外,但明确说明列是一个很好的习惯。