所以,我是使用PL / SQL的新手。我已经定义了一个名为 startDate 的变量,然后我想在稍后的某些查询中引用它。但是,当我稍后在使用&& startDate 时引用它时,系统会提示我输入变量。
/* Define the date bounds used */
/* Depending on the current quarter I want to set my start and end dates differently */
DROP TABLE DATE_BOUNDS;
CREATE TABLE DATE_BOUNDS AS
select
case when to_char(sysdate, 'Q') = '1' then to_date('10/01' || to_char(to_char(sysdate, 'YYYY')-1))
when to_char(sysdate, 'Q') = '2' then to_date('01/01/' || to_char(sysdate, 'YYYY'))
when to_char(sysdate, 'Q') = '3' then to_date('04/01/' || to_char(sysdate, 'YYYY'))
when to_char(sysdate, 'Q') = '4' then to_date('07/01/' || to_char(sysdate, 'YYYY'))
end as date1,
case when to_char(sysdate, 'Q') = '1' then add_months(to_date('10/01' || to_char(to_char(sysdate, 'YYYY')-1))-1,12)
when to_char(sysdate, 'Q') = '2' then add_months(to_date('01/01/' || to_char(sysdate, 'YYYY'))-1 ,12)
when to_char(sysdate, 'Q') = '3' then add_months(to_date('04/01/' || to_char(sysdate, 'YYYY'))-1,12)
when to_char(sysdate, 'Q') = '4' then add_months(to_date('07/01/' || to_char(sysdate, 'YYYY'))-1,12)
end as date2
from dual;
/* Defining the variable 'startDate' as 'date1' from the previous table */
DECLARE
startDate date;
BEGIN
SELECT date1 INTO startDate
FROM DATE_BOUNDS;
END;
当我尝试简单的事情时,例如:
select &&startDate from dual;
当我在SQL Developer中运行时,系统会提示我输入startDate,而不是只使用假设在 DECLARE 步骤中定义的内容。什么给了什么?
答案 0 :(得分:3)
您正在混淆PL / SQL startDate
变量,它在PL / SQL块中声明并且仅存在于SQL * Plus或SQL Developer substitution variable中。后者如果客户端defined,可以在匿名块中使用(尽管这样做很不寻常)。它们是不同范围内的完全独立的变量,不可互换。
您无法查看或引用块外的PL / SQL变量。如果您想要一些可以轻松引用的内容,请使用客户bind variable:
var startDate varchar2(10);
BEGIN
SELECT to_char(date1, 'YYYY-MM-DD') INTO :startDate
FROM DATE_BOUNDS;
END;
/
select :startDate, to_date(:startDate, 'YYYY-MM-DD') from dual;
或
print :startDate
但要注意三件事。首先,引用有一个冒号:startDate
,表示它是一个绑定变量;现在没有本地PL / SQL变量;你不能有日期类型,所以必须转换日期,所以这不是最好的例子......
如果要从查询中填充替换变量,可以使用column new_value
,它也是一个客户端命令,不带任何PL / SQL:
column oldColName new_value newColName
SELECT to_char(date1, 'YYYY-MM-DD') AS oldColName
FROM DATE_BOUNDS;
然后,您可以参考&newColName
。