Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle 18C中的触发问题“声明内容”_Sql_Oracle - Fatal编程技术网

Sql Oracle 18C中的触发问题“声明内容”

Sql Oracle 18C中的触发问题“声明内容”,sql,oracle,Sql,Oracle,嗨,我在尝试创建触发器时遇到了一些问题 `CREATE OR REPLACE TRIGGER summary_check BEFORE UPDATE OR INSERT ON POST FOR EACH ROW BEGIN IF : NEW.summary != SUBSTR(content,1,11) || '...' THEN RAISE_APPLICATION_ERROR(-20001,'The summary rule need to be followed'); END IF; EN

嗨,我在尝试创建触发器时遇到了一些问题

`CREATE OR REPLACE TRIGGER summary_check
BEFORE UPDATE OR INSERT ON POST
FOR EACH ROW
BEGIN 
IF : NEW.summary != SUBSTR(content,1,11) || '...' THEN
RAISE_APPLICATION_ERROR(-20001,'The summary rule need to be followed');
END IF;
END;`
这一个有一个编译问题,我需要声明内容,然后如果我使用post.content,它告诉我这种上下文是不允许的?它们都是VARVHAR,所以它们是同一类型。不是用户我应该在这里改变什么

`CREATE OR REPLACE TRIGGER date_check
BEFORE UPDATE OR INSERT ON Likes
FOR EACH ROW
DECLARE
V_DATE DATE;
BEGIN 
SELECT created_on
INTO V_DATE
FROM post
WHERE post_id = post.post_id;
IF : NEW.liked_on < v_date THEN
RAISE_APPLICATION_ERROR(-20001,'the date have to entered correctly ');
END IF;
END;`
这是另一个,这一个在编译方面没有问题,但是当我尝试测试触发器时,它总是说确切的获取返回的比请求的多,不确定如何更改它

此查询:

SELECT created_on
INTO V_DATE
FROM post
WHERE post_id = post.post_id;
不是在做你想做的事。post\u id还引用post.post\u id。因此,这将返回post中post\u id不为NULL的所有行

我想你想要:

SELECT p.created_on
INTO V_DATE
FROM post p
WHERE :NEW.post_id = p.post_id;
对于第一个问题,我认为如果触发器中使用的两列都属于同一个表,则甚至不需要触发器。 这可以通过添加检查约束来完成

Alter table post
Add constraint summary_check
Check (summary = SUBSTR(content,1,11) || '...');
对于@gordon提到的第二个问题,只需使用:new.post\u id而不是post.post\u id。
干杯

也许你是说NEW.content?你在:和NEW之间有一个空格。是的,我试过这样做,但它告诉我'ORA-00904:NEW.POST\u ID:invalid identifier'如果我使用:NEW.POST\u ID而不是NEW.POST\u ID,谢谢你的帮助谢谢,但对于第一个,我必须使用触发器,这是一项要求