Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.sql脚本中定义和使用变量_Sql_Oracle_Plsql - Fatal编程技术网

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

在.sql脚本中定义和使用变量,sql,oracle,plsql,Sql,Oracle,Plsql,我试图在.sql文件中定义变量,以便在sql语句中使用它们。但我对这些变量是如何定义的感到困惑,我甚至找不到一个好的在线资源可以清楚地解释这一切。我遵循不同来源的建议,在“Oracle SQL Developer”中不断出现编译错误。以下是我的两个问题: 问题1:似乎可以用以下两种方式定义变量。这两种方法有什么区别,我可以同时使用吗 define first_name = Joe; select * from customer where name = '&firstname'; 或

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

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

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


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

在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

这就是您要找的吗?

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

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

PL/SQL procedure successfully completed.

SQL> print myNum;

     MYNUM                                        
----------                                        
   123.456                                        
还支持许多其他类型。下面是VARIABLE命令的
用法
帮助文本:

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 ] ]
。。。它更像是C/C++中的定义。你不能把它当作一个变量;每次SQL*Plus看到
和first\u name
时,都会粘贴文本

当你这么做的时候

define first_name = Joe
select * from customer where name = '&first_name';
variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :first_name;
您正在创建一个可以操纵的真实变量


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

-问题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”:

带有bind变量的同一语句将提交到Oracle数据库服务器。数据库使用缓存区域来发现相同的语句被非法运行,并再次使用它。然后数据库使用变量值。这意味着数据库不需要重新解析和计算同一语句的最佳执行计划。 但第一种类型(替换变量)并非如此


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

您可以在此处找到更多详细信息:

您似乎忘记了用分号终止第一个代码块中的第一行。此外,如果您发布所收到的编译错误,可能会有所帮助。问题2的简短答案:否。另请参见。@user1888243-我已扩展了我的答案,以描述“问题1”和“问题2”之间的区别。卢克是正确的,“问题2”的简短答案是否定的;希望我的扩展答案能解释原因。谢谢Ed。谢谢运气。我刚才看了你在那个问题上的回答;那正是我想要的;绑定变量和替换变量之间的差异。感谢您的回复。事实上,这是我可以使用的第三种语法。为什么定义变量的方法都不同,它们的区别是什么?所有这些语法都是Oracle创建的吗?@User….我不知道哪一个更适合你的情况。我使用的是Oracle10,这是我们在Oracle10中的首选方法。另外,我使用了您在上面提供的语法,我得到了“Bind Variable”my_number“NOT DECLARED”。因此,语法不起作用;我要寻找的是如何在简单的sql脚本中完成它;两种方法之间的差异。令人惊讶的是,对于一些成熟的软件和行业来说,没有在线资源可以从逻辑上解释这些。我不明白,Oracle在这些领域的文档很糟糕。
select * from customer where name = 'Joe';
exec :first_name:= 'Mark';