这两个变量声明之间有什么区别?
1:num number:='&&num';
2:variable num1 number;
由于在这两种情况下我都可以在其他文件中使用num
或&num
来引用&&num
,
在绑定变量:num1
的情况下。
此外,我还有一个困惑:以下任何一种陈述是否有所不同,它们是否有效,是否意味着同样的事情?
1:variable num1 number;
2:var num1 number;
答案 0 :(得分:29)
您似乎对Oracle中的绑定变量与SQL * Plus中的替换变量之间的差异感到困惑。
让我们从替换变量开始。替换变量是SQL * Plus独有的,不属于数据库。例如,如果您尝试将它们与JDBC一起使用,它们将无法工作。
替换变量只能包含一段文字。如果SQL * Plus在输入行中遇到替换变量,它将用其文本内容替换变量:
SQL> define subvar=X SQL> select * from dual where dummy = &subvar; old 1: select * from dual where dummy = &subvar new 1: select * from dual where dummy = X select * from dual where dummy = X * ERROR at line 1: ORA-00904: "X": invalid identifier
请注意,SQL * Plus将替换变量替换为其文本值,而不考虑它是否为我们提供了有效的SQL。在上面的例子中,我们省略了&subvar
周围的单引号,它给了我们无效的SQL,所以我们得到了一个错误。
以old
和new
开头的行显示我们在SQL * Plus应用替换变量之前和之后输入的行。 new
行是数据库尝试运行的行。
您可以使用old
和new
启用或停用SET VERIFY ON
和SET VERIFY OFF
行的显示。您还可以使用SET DEFINE ON
和SET DEFINE OFF
打开或关闭替换变量的替换。
如果我们想使用替换变量运行上述查询,我们必须在其周围加上引号:
SQL> select * from dual where dummy = '&subvar'; old 1: select * from dual where dummy = '&subvar' new 1: select * from dual where dummy = 'X' D - X
如果&subvar
碰巧包含一个有效数字的字符串(例如5
),那么我们可以在不使用引号的情况下离开,但这只是因为取出了{{1}文本并将其替换为文本&subvar
恰好为我们提供了有效的SQL。
例如,假设我们有一个名为5
的表,其中包含以下数据:
A ---------- 1 2 3 4 5
然后我们可以做
SQL> define subvar=5 SQL> select * from test where a = &subvar; old 1: select * from test where a = &subvar new 1: select * from test where a = 5 A ---------- 5
另一方面,绑定变量有类型。它们不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。
SQL> variable bindvar varchar2(1); SQL> exec :bindvar := 'X'; PL/SQL procedure successfully completed.
如果要使用它,请不要在绑定变量周围加上引号:
SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; no rows selected
在上面的第二个示例中,我们没有返回任何行,因为test
表没有包含文本DUAL
的{{1}}列的行。
如果您尝试将错误类型的值分配给绑定变量,则会收到错误:
SQL> variable bindvar number; SQL> exec :bindvar := 'X'; BEGIN :bindvar := 'X'; END; * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 1
绑定变量是数据库的标准部分,您可以将它们与JDBC或任何连接到您选择的数据库的方法一起使用。
最后,DUMMY
和:bindvar
都意味着同样的事情。它们都定义了variable num1 number
类型的绑定变量var num1 number
。 num1
只是number
的缩写。