如何在oracle存储过程中的'if'条件下进行模式匹配

时间:2014-07-09 13:24:29

标签: oracle

CREATE OR REPLACE PROCEDURE get_pop1
AS
ROUTERNAME_V varchar2(100);
BEGIN
SELECT TRAFFIC_CUST_ID
INTO ROUTERNAME_V
FROM INTERFACE_ATTLAS
WHERE rownum < 2;
IF  CHARINDEX('RNS',ROUTERNAME_V) > 0
dbms_output.put_line(routername_v);
ELSE
PRINT 'It doesn''t Contain'
END;

/ *在这里,我正在尝试显示只有它开始的记录和RNS&#39;串  我得到的错误如下:


10/3 PLS-00103:遇到符号&#34; DBMS_OUTPUT&#34;什么时候期待          以下之一:          *&amp; - + / at mod余数rem然后和或          ||多集          符号&#34; *&#34;取而代之的是&#34; DBMS_OUTPUT&#34;继续。

10/37 PLS-00103:遇到符号&#34 ;;&#34;当期待其中一个          以下:          。 (*%&amp; - + / at mod remaining rem then          和或|| * /

2 个答案:

答案 0 :(得分:0)

CREATE OR REPLACE PROCEDURE get_pop1
AS
ROUTERNAME_V varchar2(100);
BEGIN
SELECT TRAFFIC_CUST_ID
INTO ROUTERNAME_V
FROM INTERFACE_ATTLAS
WHERE TRAFFIC_CUST_ID LIKE '%RNS%' and rownum < 2;
IF  CHARINDEX('RNS',ROUTERNAME_V) > 0 THEN
dbms_output.put_line(routername_v);
END;

我不确定你是否想要开始使用String RNS,你可能想要用'RNS%'替换'%RNS%'。

答案 1 :(得分:0)

CHARINDEXPRINT不是Oracle功能。除非您已将自己定义为包装器,否则您需要切换到Oracle确实识别的功能。您还缺少THENEND IF

CREATE OR REPLACE PROCEDURE get_pop1
AS
  ROUTERNAME_V varchar2(100);
BEGIN
  SELECT TRAFFIC_CUST_ID
  INTO ROUTERNAME_V
  FROM INTERFACE_ATTLAS
  WHERE rownum < 2;

  IF INSTR(ROUTERNAME_V, 'RNS') > 0 THEN
    dbms_output.put_line(routername_v);
  ELSE
    dbms_output.put_line('It doesn''t Contain');
  END IF;
END;
/

你说你希望字符串以RNS开头,而INSTR会在任何地方找到它;你需要测试它确切地返回1,而不是&gt; 0

你也可以这样做:

  IF ROUTERNAME_V LIKE 'RNS%' THEN

DBMS_OUTPUT将文本放入一个缓冲区,然后其他东西可以检索,所以如果你的客户端在执行时期望它(不仅仅是在编译时),你只会看到任何东西;例如在SQL * Plus中使用set serveroutput on,或在SQL Developer中打开DBMS输出面板。你通常不应该依赖那些可用的东西。

set serveroutput on
exec get_pop1;

过程名称中的get表示您可能真的需要一个返回值的函数,或者如果它不匹配您的模式,则为固定字符串。

CREATE OR REPLACE FUNCTION get_pop2
RETURN VARCHAR2 AS
  ROUTERNAME_V varchar2(100);
BEGIN
  SELECT TRAFFIC_CUST_ID
  INTO ROUTERNAME_V
  FROM INTERFACE_ATTLAS
  WHERE rownum < 2;

  IF ROUTERNAME_V LIKE 'RNS%' THEN
    RETURN(routername_v);
  ELSE
    RETURN('It doesn''t Contain');
  END IF;
END;
/

然后你可以这样做:

select get_pop2 from dual;

值得注意的是,您要从表中选择任意行。如果它有多行,则无法确定你获得哪一行;针对相同数据的相同查询可以获得不同的行。您需要一个过滤器和/或order by来控制您获得的内容,例如如果它们带有时间戳,则为最新记录。