如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?
Posted
技术标签:
【中文标题】如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?【英文标题】:How to check value exist of an input param value as a list against a PL/SQL variable value?如何根据 PL/SQL 变量值检查输入参数值是否存在作为列表? 【发布时间】:2017-09-01 06:02:05 【问题描述】:C# 变量
string val_1 = 'A','B','C';
我将此变量作为 PL/SQL 方法参数传递,并检查 PL/SQL 方法中另一个变量的值,如下所示:
Procedure x(val_1 IN VARCHAR2)
IS
val_2 VARCHAR2(1):= 'A';
BEGIN
IF (val_2 IN (val_1)) THEN
dbms_output.put_line('matched');
END IF;
END;
此条件不起作用。知道我做错了什么吗?
【问题讨论】:
val_1
看起来只是一个包含逗号和引号的字符串。要使val_2
匹配它,它必须具有值'A','B','C'
。您可能需要传入一个嵌套表数组并使用if val_2 member of val_1
,或者一个关联数组并循环其值,或者保留字符串并使用正则表达式进行匹配。 (我会回答这个问题,但我现在时间有点短。)
也许是if ','||val1||',' like '%,'||val2||',%' then ...
?不过,您的初始字符串看起来有点可疑 - 您实际上是在传递 'A', 'B', 'C'
,还是在传递 A, B, C
?
两种方式都行不通
请回答我关于您传入的确切字符串的问题。
是的,我尝试了两个字符串,但它们都不起作用
【参考方案1】:
var1 varchar2(1000) := 'a','b','c'
- 不正确var1 varchar2(1000) := q'~ 'a','b','c'~';
- 正确var1 varchar2(1000) := 'a,b,c';
- 正确
somthing in (varchar2_variable) is incorrect
。 oracle中没有这样的构造。;
简单的解决方案示例。但是这两种解决方案都可能在未来引起问题。更灵活的是带有regexp
的版本
declare
var1 varchar2(1000) := q'~ 'a','b','c' ~';
to_test varchar2(100) := 'a';
begin
if instr(var1,to_test) > 0 then
dbms_output.put_line('Matched');
end if;
end;
declare
var1 varchar2(1000) := q'~ 'a','b','c' ~';
to_test varchar2(100) := 'a';
begin
if regexp_instr(var1,to_test) > 0 then
dbms_output.put_line('Matched');
end if;
end;
【讨论】:
我认为您没有正确回答我的问题。 var_1 变量是在 PLSQL 方法调用发生期间传递的 C# 变量。【参考方案2】:如果你可以传入一个数组,那么这将变得更加简单。
如果您还没有数组类型,请创建一个:
create or replace type shortlist as table of varchar2(100);
使用它作为参数而不是纯字符串:
create or replace procedure x
( val_1 in shortlist )
is
val_2 varchar2(1) := 'A';
begin
if val_2 member of val_1 then
dbms_output.put_line('matched');
end if;
end;
调用过程:
begin
x(shortlist('A','B','C'));
end;
或以某种方式在 C# 中定义数组(我不懂 C#)
string[] names = new string[3] "A", "B", "C";
并按照此处所述调用该过程:Passing array to Oracle procedure from c#
【讨论】:
以上是关于如何根据 PL/SQL 变量值检查输入参数值是不是存在作为列表?的主要内容,如果未能解决你的问题,请参考以下文章
Selenium Python 检查变量值是不是不为空。我得到 False 但有一个价值