Search code examples
sqloracle-databasedateproceduredatabase-trigger

Oracle - Trigger and Procedure compilation errors


I am trying to write a procedure to display a day of the week, but the error I get is that the "ORA-01841: The (full) year must be between -4713 and +9999 and cannot be 0". The other problem is I made a trigger that checks if column in SCOTT.BONUS.SALARY has been updated and calculates "howmuch" - raise and returns it. It says that NEW.SAL should be declared, but how can it be declared if its a column name... ? I think im pretty close but I am missing something, Can anyone help please? Much Appreciated.

-- 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;

enter image description here


Solution

  • This expression is not right:

    to_char(date'data', 'Day')
    

    The database tries to evaluate literal string 'data' as a date in ISO format ('YYYY-MM-DD'), and fails.

    You need to use to_date() first to turn your variable string to a date, and then to_char():

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