我想编写可重用的代码,需要在开头声明一些变量并在脚本中重用它们,例如:
DEFINE stupidvar = 'stupidvarcontent';
SELECT stupiddata
FROM stupidtable
WHERE stupidcolumn = &stupidvar;
如何声明一个变量并在后面的语句中重用它,比如使用SQLDeveloper .
Attempts
-
使用DECLARE部分并在
BEGIN
和END;
中插入以下SELECT语句 . 使用&stupidvar
访问变量 . -
使用关键字
DEFINE
并访问该变量 . -
使用关键字
VARIABLE
并访问该变量 .
但是我在尝试期间遇到各种错误(未绑定变量,语法错误,预期 SELECT INTO
...) .
7 回答
在SQL * Plus脚本中有几种声明变量的方法 .
首先是使用VAR . 为VAR分配值的机制是使用EXEC调用:
当我们想要调用具有OUT参数或函数的存储过程时,VAR特别有用 .
Alternativley我们可以使用替换变量 . 这些适用于交互模式:
当我们编写一个调用其他脚本的脚本时,预先定义变量会很有用:
最后是匿名的PL / SQL块 . 如您所见,我们仍然可以交互地为声明的变量赋值:
如果它是char变量,请尝试使用双引号:
要么
UPD:
在PL / SQL v.10中
keyword declare用于声明变量
指定一个值,您可以在声明时设置它
或者在你使用
INTO
语句的变量中选择一些东西,但是你需要在BEGIN
和END
中包装语句,你还需要确保只返回单个值,并且不要忘记分号 .所以完整的声明如下:
您的变量仅在
BEGIN
和END
中可用,因此如果您想使用多个变量,则必须执行多个BEGIN END
包装希望这能为您节省一些时间
如果要声明日期,然后在SQL Developer中使用它 .
问题是在脚本中使用变量意味着它将在SQL * Plus中使用 .
问题是你错过了引号而Oracle无法将值解析为数字 .
由于自动类型转换(或其他任何调用),此示例工作正常 .
如果通过在SQL * Plus中键入DEFINE进行检查,则会显示num变量为CHAR .
在这种情况下,这不是问题,因为Oracle可以处理将字符串解析为数字(如果它是有效数字) .
当字符串无法解析为数字时,Oracle无法处理它 .
有了引用,所以不要强迫Oracle解析数字,也没关系:
那么,要回答原始问题,应该像这样的样本:
还有另一种方法可以使用 Query Column Value 在SQL * Plus中存储变量 .
COL [UMN]具有 new_value 选项,用于按字段名称查询值 .
如您所见,X.log值已设置为 stupid_var 变量,因此我们可以在当前目录中找到一个X.log文件中有一些日志 .
只是想添加Matas ' answer. Maybe it'显而易见,但我已经搜索了很长时间才弄明白 variable is accessible only inside the BEGIN-END 构造,所以如果你以后需要在某些代码中使用它,你需要 put this code inside the BEGIN-END block .
请注意这些 blocks can be nested :
这是你的答案: