Discussions
Categories
- 197K All Categories
- 2.5K Data
- 546 Big Data Appliance
- 1.9K Data Science
- 450.8K Databases
- 221.9K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 552 MySQL Community Space
- 479 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.1K ORDS, SODA & JSON in the Database
- 555 SQLcl
- 4K SQL Developer Data Modeler
- 187.2K SQL & PL/SQL
- 21.4K SQL Developer
- 296.3K Development
- 17 Developer Projects
- 139 Programming Languages
- 293K Development Tools
- 110 DevOps
- 3.1K QA/Testing
- 646.1K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 158 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.2K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 19 Java Essentials
- 162 Java 8 Questions
- 86K Java Programming
- 81 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 205 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 468 LiveLabs
- 39 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 175 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 233 Portuguese
Issues with procedure!
Answers
-
Thanks Frank! Whats the right way of finding difference between two dates?
-
The right way is to use 4 digit year, use RR format or better use date literals. For example:
DATE '1980-01-01'
And BETWEEN works left to right, therefore start value must be less or equal to end value, therefore
WHERE HIREDATE BETWEEN TO_DATE('01-01-85','DD-MM-YY') AND TO_DATE('01-01-80','DD-MM-YY');
will never work. Use:WHERE HIREDATE BETWEEN DATE '1980-01-01' AND DATE '1985-01-01';
And keep in mind, the above includes January 1, 1985. Somehow I have a feeling you want:WHERE HIREDATE BETWEEN DATE '1980-01-01' AND DATE '1984-12-31';
SY. -
And one more thing. Why do you have literals in where clause? It sounds you should use procedure parameters:
WHERE HIREDATE BETWEEN START_DATE AND END_DATE;
SY.
-
There's nothing between line 12 and 13. You need to have some code between IF and END IF
if c1%notfound then
endif;
BTW why don't you do a simple INERT...SELECT ?
-
Hi,
This will solve your problem
------------------------------------
CREATE OR REPLACE procedure VALID_PROC( START_DATE IN DATE, END_DATE IN DATE)
IS
cursor c1 is
SELECT * FROM EMP
WHERE HIREDATE BETWEEN TO_DATE(START_DATE,'DD-MM-YYYY') AND TO_DATE(END_DATE,'DD-MM-YYYY');
c_row c1%rowtype;
BEGIN
OPEN C1;
loop
fetch c1 into c_row;
exit when c1%notfound;
INSERT INTO emp_back(empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES(c_row.empno,c_row.ename,c_row.job,c_row.mgr,c_row.hiredate,c_row.sal,c_row.comm,c_row.deptno);
end loop;
close c1;
END;
--------------------------
mistakes : missed MGR value
didn't use loop
when Procedure/Function return compilation error...please try
SHOW ERROR PROCEDURE procedure_name;
it will give cause of error.
Thanks
Rajesh
-
user782973-Oracle wrote: Hi, Can someone help me understand whats wrong with my procedure.
- CREATE OR REPLACE procedure VALID_PROC( START_DATE IN DATE, END_DATE IN DATE)
- IS
- cursor c1 is
- SELECT * FROM EMP
- WHERE HIREDATE BETWEEN TO_DATE('01-01-85','DD-MM-YY') AND TO_DATE('01-01-80','DD-MM-YY');
- c_row c1%rowtype;
- BEGIN
- OPEN C1;
- fetch c1 into c_row;
- if c1%notfound then
- endif;
- INSERT INTO emp_back(empno,ename,job,mgr,hiredate,sal,comm,deptno)
- VALUES(c_row.empno,c_row.ename,c_row.job,c_row.hiredate,c_row.sal,c_row.comm,c_row.deptno);
- commit;
- close c1;
- END;
- /
CREATE OR REPLACE procedure VALID_PROC( START_DATE IN DATE, END_DATE IN DATE) IS cursor c1 is SELECT * FROM EMP WHERE HIREDATE BETWEEN TO_DATE('01-01-85','DD-MM-YY') AND TO_DATE('01-01-80','DD-MM-YY'); c_row c1%rowtype; BEGIN OPEN C1; fetch c1 into c_row; if c1%notfound then endif; INSERT INTO emp_back(empno,ename,job,mgr,hiredate,sal,comm,deptno) VALUES(c_row.empno,c_row.ename,c_row.job,c_row.hiredate,c_row.sal,c_row.comm,c_row.deptno); commit; close c1; END; /
What's right with it is the question.... the answer being... "not much".
The whole thing can be simplified to just:
create or replace procedure valid_proc(start_date in date, end_date in date) as begin insert into emp_back(empno, ename, job, mgr, hiredate, sal, comm, deptno) select empno, ename, job, mgr, hiredate, sal, comm, deptno from emp where hiredate between start_date and end_date; commit; -- if appropriate to business/transaction logic end; /