【问题标题】:Oracle - Trigger and Procedure compilation errorsOracle - 触发器和过程编译错误
【发布时间】:2020-01-30 22:31:37
【问题描述】:

我正在尝试编写一个程序来显示一周中的某一天,但我得到的错误是“ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0”。 另一个问题是我创建了一个触发器来检查 SCOTT.BONUS.SALARY 中的列是否已更新并计算“多少” - 提高并返回它。它说应该声明 NEW.SAL ,但是如果它是列名,如何声明...? 我认为我很接近,但我错过了一些东西,有人可以帮忙吗?非常感谢。

-- trigger --
CREATE OR REPLACE TRIGGER Raise 
BEFORE DELETE OR INSERT OR UPDATE ON SCOTT.BONUS
FOR EACH ROW 
WHEN (NEW.SAL > 0.1*OLD.SAL) 
DECLARE 
   howmuch number; 
BEGIN 
   howmuch := 0.1*NEW.SAL; 
   dbms_output.put_line('Bonus changed to 10% - : ' || howmuch); 
END; 
/

    -- Procedure --
CREATE OR REPLACE PROCEDURE Birth_Day(data IN varchar, Dey OUT varchar) IS 
BEGIN        
   select to_char(date'data', 'Day') INTO Dey from dual;
END; 
/    
 -- Starting procedure Birth_Day --
DECLARE
    Dey varchar(20);
begin
    Birth_Day('10/11/2020',Dey); 
end;

【问题讨论】:

  • 你不应该一次问两个不同的问题。我回答了其中一个。考虑为另一个问题问另一个问题。

标签: sql oracle date procedure database-trigger


【解决方案1】:

这个表述不对:

to_char(date'data', 'Day')

数据库尝试将 文字字符串 'data' 评估为 ISO 格式 ('YYYY-MM-DD') 的日期,但失败了。

您需要先使用to_date() 将变量字符串转换为date,然后再使用to_char()

to_char(to_date(data, 'DD/MM/YYYY'), 'Day')

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多