CHARINDEX 和 PRINT 不是 Oracle 函数。除非您自己将它们定义为包装器,否则您需要切换到 Oracle 能够识别的功能。您还缺少THEN 和END 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 来控制您获得的内容,例如如果有时间戳,则为最新记录。