Ste*_*eef 3 sql oracle named-parameters
你能在普通的oracle函数中使用命名参数,例如REGEXP_REPLACE吗?我喜欢命名参数表示法,并总是使用它来调用自定义的PL/SQL代码片段,但以下似乎不起作用:
select regexp_replace( string => 'TechOnTheNet'
, pattern => 'a|e|i|o|u'
, replacement_string => 'Z'
, start_position => 1
, nth_appearance => 2
, match_parameter => 'i') from dual;
Run Code Online (Sandbox Code Playgroud)
不适用于从SQL调用的内置函数; 但你可以从带有赋值的PL/SQL(以及正确的形式参数名称):
declare
x varchar2(30);
begin
x := regexp_replace( srcstr => 'TechOnTheNet'
, pattern => 'a|e|i|o|u'
, replacestr => 'Z'
, position => 1
, occurrence => 2
, modifier => 'i');
end;
/
TechZnTheNet
PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)
即使在那里,您也无法直接选择功能结果.
有一个解决方法,但它有点凌乱.PL/SQL赋值使用函数的STANDARD包版本,所以如果你使用PL/SQL提供的函数,你可以调用它:
select sys.standard.regexp_replace( srcstr => 'TechOnTheNet'
, pattern => 'a|e|i|o|u'
, replacestr => 'Z'
, position => 1
, occurrence => 2
, modifier => 'i') from dual;
SYS.STANDARD.REGEXP_REPLACE(SRCSTR=>'TECHONTHENET',PATTERN=>'A|E|I|O|U',REPLACES
--------------------------------------------------------------------------------
TechZnTheNet
Run Code Online (Sandbox Code Playgroud)
除了更长时间之外,您可能会在两个版本之间看到不同的性能 - 我不知道是否可以安全地假设它们最终实现相同.
您可以通过简单的查询查看可用的函数,例如:
select object_name, position, argument_name, in_out, data_type
from all_arguments
where owner = 'SYS' and package_name = 'STANDARD'
order by object_name, overload, position;
Run Code Online (Sandbox Code Playgroud)
为此regexp_replace,显示了可用于不同参数数据类型的函数的三个版本.(位置0中的未命名参数是函数返回类型).