SqlPlus - 定义变量substring

时间:2017-08-09 13:17:33

标签: sqlplus

我是sqlplus的新手,我在变量的基本用法方面遇到了困难:)

我有以下内容:

define PROJECT_VERSION='1.1-SNAPSHOT'

我想创建一个其他变量,其中包含相同的信息而不包含-SNAPSHOT部分(因此其值为1.1)。当然,我不想输入define PROJECT_VERSION_WOSNAP='1.1',而不是像define PROJECT_VERSION_WOSNAP=replace(&PROJECT_VERSION,'-SNAPSHOT','')那样更合适。

我该怎么做?

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

你的建议几乎有效;您需要将基本变量用单引号括起来:

define PROJECT_VERSION_WOSNAP=replace('&PROJECT_VERSION','-SNAPSHOT',null)

select &PROJECT_VERSION_WOSNAP from dual;

old:select &PROJECT_VERSION_WOSNAP from dual
new:select replace('1.1-SNAPSHOT','-SNAPSHOT',null) from dual

REP
---
1.1

我已离开verify,因此您可以看到每次稍后引用替换变量时都会重复replace()操作,这不一定是大问题,但需要注意的事项。

您还可以使用the column ... new_value syntax来定义变量:

undefine PROJECT_VERSION_WOSNAP
column TMP_VERSION new_value PROJECT_VERSION_WOSNAP
select replace('&PROJECT_VERSION','-SNAPSHOT',null) as TMP_VERSION from dual;

old:select replace('&PROJECT_VERSION','-SNAPSHOT',null) as TMP_VERSION from dual
new:select replace('1.1-SNAPSHOT','-SNAPSHOT',null) as TMP_VERSION from dual

TMP
---
1.1

select &PROJECT_VERSION_WOSNAP from dual;

old:select &PROJECT_VERSION_WOSNAP from dual
new:select 1.1 from dual

       1.1
----------
       1.1

现在您可以看到引用直接使用该值,而不重复replace() - 它只在该列设置查询中发生一次。除了set termout off之外,您可以on然后set verify off围绕设置变量的查询隐藏它。

另一种方法是以相反的方式定义变量:

undefine PROJECT_VERSION
undefine PROJECT_VERSION_WOSNAP
define PROJECT_VERSION_WOSNAP=1.1
define PROJECT_VERSION='&PROJECT_VERSION_WOSNAP.-SNAPHOT'

select '&PROJECT_VERSION', &PROJECT_VERSION_WOSNAP from dual;

old:select '&PROJECT_VERSION', &PROJECT_VERSION_WOSNAP from dual
new:select '1.1-SNAPHOT', 1.1 from dual

'1.1-SNAPHO        1.1
----------- ----------
1.1-SNAPHOT        1.1

但如果总是需要,则假定为snapshot部分,并且从您提出问题的方式我怀疑可以改变。

另一种方法是使用整个绑定变量而不是替换变量:

var PROJECT_VERSION varchar2(20);
var PROJECT_VERSION_WOSNAP varchar2(20);
exec :PROJECT_VERSION := '1.1-SNAPSHOT';
exec :PROJECT_VERSION_WOSNAP := replace(:PROJECT_VERSION,'-SNAPSHOT',null);

select :PROJECT_VERSION, :PROJECT_VERSION_WOSNAP from dual;

:PROJECT_VERSION                 :PROJECT_VERSION_WOSNAP
-------------------------------- --------------------------------
1.1-SNAPSHOT                     1.1

但是,这可能不适用于你以后做的任何事情。