CREATE OR REPLACE TRIGGER VIETRESORTBL_INSERT_TRIGGER
BEFORE INSERT ON  VIETRESORTBL
FOR EACH ROW 
DECLARE
  ZBH2 VARCHAR2(16);
  I NUMBER;
  L NUMBER;
BEGIN
  L := LENGTH(:NEW.ZBH) ;
  FOR I IN 1 .. L LOOP
    ZBH2 := SUBSTRB(:NEW.ZBH,I,1);
    IF ZBH2 NOT BETWEEN 'A' AND 'Z' THEN
      raise_application_error(-20001,'编号每个字符必须是由大写"A"到"Z"的字符');
    END IF;
  END LOOP;      
END;
/

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER VIETRESORTBL_INSERT_TRIGGER
    BEFORE INSERT ON  VIETRESORTBL
    FOR EACH ROW 
    DECLARE
      ZBH2 VARCHAR2(16);
      I NUMBER:=1;
      L NUMBER;
    BEGIN
      L := LENGTH(:NEW.ZBH) ;
      FOR I in 1..L loop
        ZBH2 := SUBSTRB(:NEW.ZBH,I,1);
        IF ascII(ZBH2) <60 or ascii(zbh2)>90 then
           raise_application_error(-20001,'编号每个字符必须是由大写"A"到"Z"的字符');
        END IF;
        end loop;
           
    END;
    /
      

  2.   

    创建表时使用 check 约束来实现比较简单,如下表中的 c 字段只允许插入大写字母
    create table t
    (
      c varchar2(100)
        check (ltrim(c,'ABCDEFGHIJKLMNOPQRSTUVWXYZ') is null)
    );
      

  3.   

    很简单呀,你就一个for循环的格式写错了for i in 1..L loop      end loop;其他的也没有什么 问题了!