Sql 为什么会提示我输入已经定义的变量?

Sql 为什么会提示我输入已经定义的变量?,sql,oracle,variables,dynamic,Sql,Oracle,Variables,Dynamic,因此,我不熟悉使用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

因此,我不熟悉使用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,而不是仅仅使用声明步骤中应该定义的内容。。。给出了什么?

您将PL/SQL
startDate
变量与SQL*Plus或SQL开发人员混淆了,该变量在中声明,并且仅存在于PL/SQL块中。后者可以由客户端使用,并且可以在匿名块中使用(尽管这样做很少见)。它们在不同的范围内是完全独立的变量,不能互换

您无法在块外看到或引用PL/SQL变量。如果您想要在两个网站上都能轻松参考的内容,请使用客户端:

但有三件事需要注意。首先,引用有一个冒号,
:startDate
,表示它是一个绑定变量;现在没有本地PL/SQL变量;你不能有日期类型,所以必须转换为日期和从日期,所以这不是最好的例子


如果要从查询中填充替换变量,可以使用,这也是一个客户端命令,而不使用任何PL/SQL:

column oldColName new_value newColName
SELECT to_char(date1, 'YYYY-MM-DD') AS oldColName
FROM DATE_BOUNDS;

然后参考
&newColName

将PL/SQL
startDate
变量与SQL*Plus或SQL开发人员混淆,该变量在中声明且仅存在于PL/SQL块中。后者可以由客户端使用,并且可以在匿名块中使用(尽管这样做很少见)。它们在不同的范围内是完全独立的变量,不能互换

您无法在块外看到或引用PL/SQL变量。如果您想要在两个网站上都能轻松参考的内容,请使用客户端:

但有三件事需要注意。首先,引用有一个冒号,
:startDate
,表示它是一个绑定变量;现在没有本地PL/SQL变量;你不能有日期类型,所以必须转换为日期和从日期,所以这不是最好的例子


如果要从查询中填充替换变量,可以使用,这也是一个客户端命令,而不使用任何PL/SQL:

column oldColName new_value newColName
SELECT to_char(date1, 'YYYY-MM-DD') AS oldColName
FROM DATE_BOUNDS;

然后参考
&newColName

在SQLPlus中创建绑定变量是可能的,但我不记得SQLPlus命令了。在PL/SQL匿名块中为该变量赋值。然后稍后使用该值绑定变量,例如
select:startDate from dual
。一个限制是类型有限,
DATE
不受SQL*Plus支持。(可能已经改变了。)这个很好用,谢谢。但是,稍后我将在CREATETABLE语句中使用日期,正如我刚刚发现的,这些语句不允许绑定变量。哦,好的。@mjavon-我添加了一种从查询中获取值的方法,作为替换变量,然后可以在
创建表
中使用。或者别的什么。不过,您需要一个不同的格式掩码,没有破折号。基于日期或任何其他数据创建表听起来不是一个好的数据模型,但这是另一个问题。在SQLPlus中创建绑定变量是可能的,但我不记得SQLPlus命令了。在PL/SQL匿名块中为该变量赋值。然后稍后使用该值绑定变量,例如
select:startDate from dual
。一个限制是类型有限,
DATE
不受SQL*Plus支持。(可能已经改变了。)这个很好用,谢谢。但是,稍后我将在CREATETABLE语句中使用日期,正如我刚刚发现的,这些语句不允许绑定变量。哦,好的。@mjavon-我添加了一种从查询中获取值的方法,作为替换变量,然后可以在
创建表
中使用。或者别的什么。不过,您需要一个不同的格式掩码,没有破折号。基于日期或任何其他数据创建表听起来不是一个好的数据模型,但这是另一个问题。
column oldColName new_value newColName
SELECT to_char(date1, 'YYYY-MM-DD') AS oldColName
FROM DATE_BOUNDS;