在.sql脚本中定义和使用变量

时间:2013-03-28 20:31:18

标签: sql oracle plsql

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

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

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的变量,如果是,我该怎么办?

3 个答案:

答案 0 :(得分:3)

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

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

PL/SQL procedure successfully completed.

SQL> print myNum;

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

还支持许多其他类型。这是VARIABLE命令的USAGE帮助文本:

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';

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

当你这样做时......

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

您正在创建一个可以操作的实际变量。

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

答案 1 :(得分:2)

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

select * from customer where name = 'Joe';

第二部分称为绑定变量,它不是SQL * Plus或SQL Developer独有的,因为您可以使用它,例如,在连接到Oracle的Java应用程序(或其他语言)中。 当您多次运行相同的语句时,绑定变量提供了更好的性能,因为您始终按原样提交语句(不重写)。然后在数据库级别评估变量。例如,让我们说你已经改变了&#34; first_name&#34;的价值。马克&#34;:

exec :first_name:= 'Mark';

将与bind变量相同的语句提交给Oracle数据库服务器。数据库使用缓存区域来查找相同的语句以前运行并再次使用它。然后数据库使用变量值。这意味着数据库不需要重新解析并重新计算同一语句的最佳执行计划。 但第一种类型(Substitution Variables)不是这种情况。

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

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

答案 2 :(得分: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

这就是你要找的东西吗?