Как узнать, содержит ли атрибут не буквенные символы в Oracle - PullRequest
0 голосов
/ 08 мая 2020

У меня есть функция, которая должна исключить все нестроковые символы, logi c функции состоит в том, что я передал строку в качестве параметра и в if сравнивает, есть ли какой-либо странный символ внутри переданного атрибута, если это true возвращает ошибку, а если не возвращает атрибут, это то, что он должен делать, но у меня возникают проблемы при этом

Я использую структуру ADT, и моя функция предназначена для проверки вставок из моих Тип ADT

Это мой ADT, в котором я определяю свои атрибуты

CREATE OR REPLACE TYPE datos_basicos_personas AS OBJECT(
    primer_nombre varchar(15),
    STATIC FUNCTION valida_primer_nombre(primer_nombre varchar) RETURN varchar
);

Функция, которая должна возвращать атрибут, если не содержит нестроковых символов

CREATE OR REPLACE TYPE BODY datos_basicos_personas IS
STATIC FUNCTION valida_primer_nombre(primer_nombre varchar) RETURN varchar
IS
BEGIN 
    IF regexp_like(primer_nombre, '^[a-zA-Z]') THEN
        return (primer_nombre);
    ELSE
        RAISE_APPLICATION_ERROR(-20001, 'Error: El Primer nombre debe contener solo letras.');
    END IF;
END;
END;

Моя таблица, которая имеет один атрибут моего типа ADT (datos_basicos_personas)

CREATE TABLE Persona (
    id NUMBER PRIMARY KEY,
    datos_basicos datos_basicos_personas
);

* Вставка, моя вставка имеет номер 9, который не должен позволять мне вставлять *

INSERT INTO Persona values (2,datos_basicos_personas(datos_basicos_personas.valida_primer_nombre('H9ilery')));

1 Ответ

1 голос
/ 08 мая 2020

Вам просто нужно ограничение CHECK, указывающее, существует ли в строке небуквенный символ, чтобы нарушить правило, с помощью регулярного выражения, такого как

CREATE TABLE Persona (
    id            INT PRIMARY KEY,
    datos_basicos VARCHAR2(15),
    CONSTRAINT chk_datos_basicos CHECK ( REGEXP_LIKE(datos_basicos,'^[[:alpha:]]+$') ) 
); 

В этом случае posix [:alpha] используется внутри REGEXP_LIKE() для проверки нарушающего символа до конца слова (до +$).

...