我正在编写一个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语句存在时。 如何存储变量以在语句中使用它们?
答案 0 :(得分:0)
这就是你写Procedure
的方法。 Syntax
是incorrect
。阅读语法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);
有关您程序的几点意见:
select *
- 而应明确说明要返回的列,因为有人向该表添加列可能会导致您的过程出错。这个“规则”有例外,但明确说明列是一个很好的习惯。