2

我正在尝试在 .sql 文件中定义变量,以便可以在我的 sql 语句中使用它们。但是我对如何定义这些变量感到非常困惑,我什至找不到一个很好的在线资源可以清楚地解释所有这些。我遵循不同来源的建议,并且在“Oracle SQL Developer”中不断出现编译错误。这是我的两个问题:

问题1:似乎可以通过以下2种方式定义变量。这两种方式有什么区别,我可以同时使用吗?

define first_name = Joe;
select * from customer where name = '&firstname';

或者

variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :firstname;

问题2: 在第一种方法中(意思是使用define命令),我可以定义一个number类型的变量吗?如果可以,我该怎么做?

4

3 回答 3

3

你可以定义NUMBER变量没问题:

SQL> VARIABLE myNum NUMBER;
SQL> EXEC :myNum := 123.456;

PL/SQL procedure successfully completed.

SQL> print myNum;

     MYNUM                                        
----------                                        
   123.456                                        

还支持许多其他类型。以下是USAGEVARIABLE 命令的帮助文本:

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
                VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
                NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
                REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ]

如果您输入VARIABLE(或仅输入VAR)而不输入任何其他内容,SQL*Plus 将列出所有变量及其值。

附录:对比原始问题中的两种变量分配样式。

当你这样做...

define first_name = Joe
select * from customer where name = '&first_name';

...它更像是#defineC/C++ 中的一个。你不能把它当作一个变量来对待;它只是每次 SQL*Plus 看到时粘贴的文本&first_name

当你这样做...

variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :first_name;

您正在创建一个可以操纵的真实变量。

请注意,如果您CHAR在定义中使用(没有大小),第一个分配将确定它的大小,之后您不能让它更长。如果您将其定义为CHAR(50)长度始终为 50 个字符并用空格填充。这可能会让人感到困惑,所以我建议VARCHAR2在大多数情况下使用字符串。

于 2013-03-28T20:51:45.800 回答
2

- 问题 1 的答案: 第一种类型的变量称为替换变量,它仅适用于 SQL*Plus 和 SQL Developer。因此,当您在任何 SQL 语句中提供替代变量时,SQL*Plus 将变量替换为它的值。它与 Oracle 服务器或性能无关。您提供的示例将在将其发送到 Oracle 数据库服务器之前转换为以下示例:

select * from customer where name = 'Joe';

第二部分称为绑定变量,它不是 SQL*Plus 或 SQL Developer 独有的,因为您可以在连接到 Oracle 的 Java 应用程序(或其他语言)中使用它。当您多次运行相同的语句时,绑定变量会提供更好的性能,因为您总是按原样提交语句(无需重写)。然后在数据库级别对变量进行评估。例如,假设您已将“first_name”的值更改为“Mark”:

exec :first_name:= 'Mark';

与绑定变量相同的语句被提交到 Oracle 数据库服务器。数据库使用缓存区域来查找以前运行过的相同语句并再次使用它。然后数据库使用变量值。这意味着数据库不需要为同一条语句重新解析和重新计算最佳执行计划。但第一种类型(替代变量)并非如此。

- 对问题 2 的回答: 不,你不能,因为正如我上面所说,SQL*Plus 或 SQL Developer 所做的只是重写语句,用它的值替换变量名。它对它的类型一无所知。这里只进行文本替换。

您可以在此处找到更多详细信息: http ://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php

于 2013-03-28T21:25:21.587 回答
0

在 Oracle 中,您可以按如下方式定义变量:

CREATE OR REPLACE FUNCTION MyFunction()
AS

    my_number     NUMBER (20, 0);
    first_name    VARCHAR2(256);

BEGIN
    first_name := 'Joe';
    select * from customer where name = first_name;

END

那是你要找的吗?

于 2013-03-28T20:37:04.643 回答