【问题标题】:How to do the pattern matching in 'if' condition in oracle stored procedure如何在 oracle 存储过程中的“if”条件下进行模式匹配
【发布时间】:2014-07-09 13:24:28
【问题描述】:
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”字符串开头的记录 我收到如下错误:


10/3 PLS-00103:预期时遇到符号“DBMS_OUTPUT” 以下之一: * & - + / 在 mod 余数 rem then 和 or ||多集 符号“*”被替换为“DBMS_OUTPUT”以继续。

10/37 PLS-00103:遇到符号“;”当期待其中之一 下列的: . ( * % & - + / 在 mod 余数 rem 然后 和或 || */

【问题讨论】:

    标签: oracle


    【解决方案1】:

    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,而不是 > 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 来控制您获得的内容,例如如果有时间戳,则为最新记录。

    【讨论】:

    • 还有一个疑问是在命令模式下执行后如何显示数据..?
    • @user3165241 - 我已经添加了关于依赖 DBMS_OUTPUT 的注释。如何显示它取决于您的客户。我也展示了如何将它变成一个函数,这可能会更有用。这取决于你需要做什么。
    • 非常感谢,这些信息对我更有用。我认为它可能会帮助其他刚开始的人
    【解决方案2】:
    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;
    

    我不确定您是否希望字符串 RNS 在开头,您可能希望将 '%RNS%' 替换为 'RNS%'。

    【讨论】:

    • 您忘记了以“IF”开头的行尾的“THEN”
    • 我已经尝试过上面的代码我收到错误,例如:PROCEDURE GET_POP1 的错误:LINE/COL ERROR -------- ------------- -------------------------------------------------- 11/4 PLS-00103:遇到符号“;”预期以下情况之一时:如果
    • 嗨,我已经包含了 END IF ,所以错误已经消失了
    • 出现此错误:LINE/COL ERROR -------- ------------- ----------------------------------------- : 9/1 PL/SQL: 语句被忽略 9/5 PLS-00201: 标识符 'CHARINDEX'必须声明
    • 你不需要这段代码:select 确保返回的行包含 RNS。删除 'IF CHARINDEX('RNS',ROUTERNAME_V) > 0 THEN' 和 'END IF'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2016-01-19
    • 2013-04-25
    • 2019-07-18
    相关资源
    最近更新 更多