Как найти строки, содержащие строку в функции plsql - PullRequest
1 голос
/ 08 октября 2019

Когда я пытаюсь реализовать функцию, чтобы найти, если строки содержат строку. Функция всегда возвращает 0.

Это моя функция

member function  containsText (pString1 varchar2, pString2 varchar2)return integer is
checked integer;
begin
if INSTR(pString2,pString1)=0 then checked := 0;
else checked := 1 ;
end if;
return checked;
end containsText;
  1. Я реализую функцию, как показано ниже,

СодержитТекст (имя_таблицы).column_name, 'some_string_here');

возвращает 0.

2 Я пытаюсь выяснить, почему это не работает, используя приведенный ниже код,

содержит текст ('abcdefg', 'fg');

также возвращает 0.

я пробую только метод instr, он работает

instr ('abcdefg', 'fg');

возвращает 6.

я использую instr в запросе, чтобы реализовать мою оригинальную идею

выбрать instr (table_name.column_name, 'Great') из table_name

это работает. Как я могу заставить эту функцию работать так, как я ожидал?

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

У вас есть аргументы для INSTR в обратном порядке. Также у вас есть функция MEMBER, но вы, похоже, не используете функции, которые бы требовали этого. Вы можете использовать:

Установка Oracle :

CREATE TYPE test_obj AS OBJECT(
  value VARCHAR2(20),
  MEMBER FUNCTION checkText(
    self  IN OUT test_obj,
    match IN     VARCHAR2
  ) RETURN NUMBER
);
/

CREATE TYPE BODY test_obj IS 
  MEMBER FUNCTION checkText(
    self  IN OUT test_obj,
    match IN     VARCHAR2
  ) RETURN NUMBER
  IS
  BEGIN
    RETURN LEAST( INSTR( self.value, match ), 1 );
  END;
END;
/

Тестирование :

DECLARE
  v_test test_obj := test_obj( 'abcdefgh' );
BEGIN
  DBMS_OUTPUT.PUT_LINE( v_test.checkText( 'gh' ) );
  DBMS_OUTPUT.PUT_LINE( v_test.checkText( 'i' ) );
END;
/

Выходы:

1
0

db <> fiddle здесь


Вы также можете написать его без аргумента SELF ивзятие двух строк (как вы сделали в вопросе), но, кажется, нет смысла делать эту функцию типа MEMBER, и это может быть просто глобальная хранимая функция или функция STATICтип.

CREATE TYPE test_obj AS OBJECT(
  unused_value VARCHAR2(20),
  MEMBER FUNCTION checkText( -- could be STATIC FUNCTION
    value IN     VARCHAR2,
    match IN     VARCHAR2
  ) RETURN NUMBER
);
/

CREATE TYPE BODY test_obj IS 
  MEMBER FUNCTION checkText( -- could be STATIC FUNCTION
    value IN     VARCHAR2,
    match IN     VARCHAR2
  ) RETURN NUMBER
  IS
  BEGIN
    IF INSTR( value, match ) = 0 THEN
      RETURN 0;
    ELSE
      RETURN 1;
    END IF;
  END;
END;
/

Тогда:

DECLARE
  v_test test_obj := test_obj( 'xyz' );
BEGIN
  DBMS_OUTPUT.PUT_LINE( v_test.checkText( 'abcdefgh', 'gh' ) );
  DBMS_OUTPUT.PUT_LINE( v_test.checkText( 'abcdefgh', 'x' ) );
END;
/

Выходы:

1
0

db <> Fiddle здесь

0 голосов
/ 08 октября 2019

Попробуйте

member function  containsText (pString1 varchar2, pString2 varchar2)return integer is
checked integer;
begin
if INSTR(pString1, pString2)=0 then checked := 0;
else checked := 1 ;
end if;
return checked;
end containsText;

Вы измените в INSTR (pString1, pString2) = 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...