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 和或|| * /
答案 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)
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,而不是&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
来控制您获得的内容,例如如果它们带有时间戳,则为最新记录。