如何根据 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 变量值检查输入参数值是不是存在作为列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Oracle PL/SQL 中的参数列表值?

PL/SQL查询中的空值问题

Selenium Python 检查变量值是不是不为空。我得到 False 但有一个价值

如何在具有值而不是单个变量值的列表上应用 PyQt5 事件? [关闭]

Oracle PL/SQL 动态更改变量值的问题

如何判断一个变量值是不是是 TCL 中的一个数字?