Sql 为什么会提示我输入已经定义的变量?
因此,我不熟悉使用PL/SQL。我已经定义了一个名为startDate的变量,然后我想稍后在一些查询中引用它。但是,当我稍后使用&&startDate引用它时,系统会提示我输入变量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
/* 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/SQLstartDate
变量与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;