what should i do?? - hints? [message #200728] |
Wed, 01 November 2006 01:57 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
some hints please////...
procedure delete_campaign(ctitle in campaing.title%Type)
suppose that campaign has been completed and paid for. also suppose that all the detaails about the campaign have been recorded in some other archival database(which does not concern me). every now and then the databasae is checked and such campaigns are deleted from the databse using this procedure. the following action is what i should do...
1, delete the relevant advert records,
2, delete the relevant workson records and
3, delete the campaign record.
if the given campaign does not exist, the procedure deals with the corresponding no_data_found exception. if the given campaign has a null datepaid/ campaignfinishdate value, it raises and deals with a user-defined campaign_not_finished exception. if it fails for any other reason(for example during update) it deals with a catch_all exception(others).
here is my relational data:
campaign(title, campaignfinishdate, estimatedcost, actualcost, datepaid, companyname, managerstaffno)
advert(adtitle, type, targetdate, completeddate, estimatedcost, actualcost, campaigntitle)
staffworksoncampaign(staffno, title, date, hour)
client(companyname, companyaddress, contactname, contactemail, staffno)
...
here is my starting of my code
--------------------end of procedure end_campaigns--------------------
PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
IS
CURSOR delete_campaign_cur
IS
SELECT ....
--------------------procedure end_campaigns--------------------
|
|
|
Re: what should i do?? - hints? [message #200792 is a reply to message #200728] |
Wed, 01 November 2006 06:10 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Consider avoiding cursor, and doing by just sql, if possible, like:
SQL> begin
delete from emp;
end;
/
I think it should be possible as your requirement is to just delete some data from some tables...you can work out the details..
|
|
|
Re: what should i do?? - hints? [message #200810 is a reply to message #200792] |
Wed, 01 November 2006 07:34 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
but in the question means, if campaign has been completed and paid for... we should provide those 3 steps of delete..
beside i dont get you.. can you make a good example please
or should i make a cursor .. lie this
cursor.....
select title
from campaign
where campaignfinishdate != ' ';.....
|
|
|
Re: what should i do?? - hints? [message #200813 is a reply to message #200810] |
Wed, 01 November 2006 07:39 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
I would in turn ask you to post sample data and table structure and clear requirement...
can you post table structure of all table involved, and sample data of one such campain to be deleted..(i mean data for one such case from ALL relevant tables..)
|
|
|
|
Re: what should i do?? - hints? [message #200831 is a reply to message #200728] |
Wed, 01 November 2006 08:57 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
can this work ?
PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
IS
DELETE FROM advert
where campaigntitle = ctitle;
if sql%notfound then
raise_application_error(-20011, 'Invalid campaign title: ' || ctitle);
end if;
end delete_campaign;
|
|
|
Re: what should i do?? - hints? [message #200842 is a reply to message #200831] |
Wed, 01 November 2006 10:01 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Yes, that is what I meant...you will have to check that , in order to delete something, which are the child tables or related tables, all of which you should include...but other than that, that is what I meant..the code u gave works...like:
1 CREATE OR REPLACE PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
2 IS
3 BEGIN
4 DELETE FROM advert
5 where campaigntitle = ctitle;
6 if sql%notfound then
7 raise_application_error(-20011, 'Invalid campaign title: ' || ctitle);
8 end if;
9* end delete_campaign;
SQL> /
Procedure created.
SQL> EXEC DELETE_CAMPAIGN('ABC');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM ADVERT;
ADTITLE TYPE TARGETDAT COMPLETED ESTIMATEDCOST ACTUALCOST CAMPAIGNTITLE
---------- -------- --------- --------- ------------- ---------- ------------------------------
SSS Tv 14-JUN-06 14-OCT-06 1500 1600 CDC
DDD Magazine 15-JUL-06 15-DEC-06 1700 1800 DEW
AAA Poster 16-JUN-06 16-OCT-06 1900 2000 NOM
BBB Online 16-JAN-06 16-MAY-06 2000 2300 CCC
FFF Tv 14-FEB-06 14-JAN-06 1100 1000 CDC
GGG Magazine 15-JUL-06 15-DEC-06 1800 1900 DEW
HHH Poster 16-OCT-06 16-SEP-06 1900 2100 NOM
III Online 16-FEB-06 16-APR-06 2000 2300 CCC
8 rows selected. --ABC is gone from ADVERT TABLE..
& you have avoided cursor, which do row by row process..
|
|
|
Re: what should i do?? - hints? [message #200843 is a reply to message #200728] |
Wed, 01 November 2006 10:05 |
Bill B
Messages: 1971 Registered: December 2004
|
Senior Member |
|
|
I am assuming that the advert and workson tables have a child relationship to the campaign table. If this is true, then those tables should have a foreign key back to the campaign table and the relationship should be setup with a cascade delete. If this is done, then a simple delete of the campaign record will delete all related rows in all other tables. Otherwise, delete the child tables first and then the parent.
|
|
|
Re: what should i do?? - hints? [message #200906 is a reply to message #200728] |
Wed, 01 November 2006 18:26 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
how could i modify the following code so that i can delete it row by row instead ot deleting all the related title that being called...know what i mean????
for example.....
delete('ABC')
and i want to delete one by one instad of all campaigntitle of 'ABC'
and also
i dot really sure what this means..
'I am assuming that the advert and workson tables have a child relationship to the campaign table. If this is true, then those tables should have a foreign key back to the campaign table and the relationship should be setup with a cascade delete. If this is done, then a simple delete of the campaign record will delete all related rows in all other tables. Otherwise, delete the child tables first and then the parent.'
|
|
|
Re: what should i do?? - hints? [message #200907 is a reply to message #200728] |
Wed, 01 November 2006 18:31 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
[quote title=hiip wrote on Wed, 01 November 2006 01:57]some hints please////...
procedure delete_campaign(ctitle in campaing.title%Type)
suppose that campaign has been completed and paid for. also suppose that all the detaails about the campaign have been recorded in some other archival database(which does not concern me). every now and then the databasae is checked and such campaigns are deleted from the databse using this procedure. the following action is what i should do...
1, delete the relevant advert records,
2, delete the relevant workson records and
3, delete the campaign record.
if the given campaign does not exist, the procedure deals with the corresponding no_data_found exception. if the given campaign has a null datepaid/ campaignfinishdate value, it raises and deals with a user-defined campaign_not_finished exception. if it fails for any other reason(for example during update) it deals with a catch_all exception(others).
as in my title, it says delete the campaign has been completed and the campaign is being paid ,, so we delete it..
and i want to delete three tables data....
1, advert
2, workson
3, campaign
as they are related to each others....
so what should i add into my code?
|
|
|
|
|
Re: what should i do?? - hints? [message #200951 is a reply to message #200842] |
Thu, 02 November 2006 01:06 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
nirav_hyd wrote on Wed, 01 November 2006 10:01 | Yes, that is what I meant...you will have to check that , in order to delete something, which are the child tables or related tables, all of which you should include...but other than that, that is what I meant..the code u gave works...like:
1 CREATE OR REPLACE PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
2 IS
3 BEGIN
4 DELETE FROM advert
5 where campaigntitle = ctitle;
6 if sql%notfound then
7 raise_application_error(-20011, 'Invalid campaign title: ' || ctitle);
8 end if;
9* end delete_campaign;
SQL> /
Procedure created.
SQL> EXEC DELETE_CAMPAIGN('ABC');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM ADVERT;
ADTITLE TYPE TARGETDAT COMPLETED ESTIMATEDCOST ACTUALCOST CAMPAIGNTITLE
---------- -------- --------- --------- ------------- ---------- ------------------------------
SSS Tv 14-JUN-06 14-OCT-06 1500 1600 CDC
DDD Magazine 15-JUL-06 15-DEC-06 1700 1800 DEW
AAA Poster 16-JUN-06 16-OCT-06 1900 2000 NOM
BBB Online 16-JAN-06 16-MAY-06 2000 2300 CCC
FFF Tv 14-FEB-06 14-JAN-06 1100 1000 CDC
GGG Magazine 15-JUL-06 15-DEC-06 1800 1900 DEW
HHH Poster 16-OCT-06 16-SEP-06 1900 2100 NOM
III Online 16-FEB-06 16-APR-06 2000 2300 CCC
8 rows selected. --ABC is gone from ADVERT TABLE..
& you have avoided cursor, which do row by row process..
|
hi, this is my new code,,,,
PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
IS
v_datepaid campaign.datepaid%TYPE;
v_campaignfinishdate campaign.campaignfinishdate%Type;
v_title campaign.title%Type;
campaign_not_finished EXCEPTION;
BEGIN
DELETE FROM advert
WHERE campaigntitle = ctitle;
DELETE FROM staffcampaign
WHERE title = ctitle;
DELETE FROM campaign
WHERE title = ctitle;
SELECT title, datepaid, campaignfinishdate
INTO v_title, v_datepaid, v_campaignfinishdate
FROM campaign;
IF v_datepaid IS NULL THEN
RAISE campaign_not_finished;
END IF;
IF v_campaignfinishdate IS NULL THEN
RAISE campaign_not_finished;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
('Invalid campaign title');
WHEN campaign_not_finished THEN
DBMS_OUTPUT.PUT_LINE
('Campaign not finished');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE
('It Fails for other reason');
COMMIT;
END delete_campaign;
--------------------procedure end_campaigns--------------------
what do you think of it ?? does this code meet the requirement for the question on the very top..???
|
|
|
Re: what should i do?? - hints? [message #200966 is a reply to message #200951] |
Thu, 02 November 2006 01:34 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Perhaps not..because in the SELECT clause below:
Quote: |
SELECT title, datepaid, campaignfinishdate
INTO v_title, v_datepaid, v_campaignfinishdate
FROM campaign;
|
don't you have to add a where condition? otherwise it will raise an error when campaign table has more than 1 record. please be clear conceptually and test all your outputs!
|
|
|
Re: what should i do?? - hints? [message #201002 is a reply to message #200728] |
Thu, 02 November 2006 04:00 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
this is my another new code....
PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
IS
v_datepaid campaign.datepaid%TYPE;
v_campaignfinishdate campaign.campaignfinishdate%Type;
v_title campaign.title%Type;
campaign_not_finished EXCEPTION;
BEGIN
SELECT title, datepaid, campaignfinishdate
INTO v_title, v_datepaid, v_campaignfinishdate
FROM campaign
WHERE datepaid IS NOT NULL
AND campaignfinishdate IS NOT NULL;
DELETE FROM advert
WHERE campaigntitle = ctitle;
DELETE FROM staffcampaign
WHERE title = ctitle;
DELETE FROM campaign
WHERE title = ctitle;
IF v_datepaid IS NULL THEN
RAISE campaign_not_finished;
END IF;
IF v_campaignfinishdate IS NULL THEN
RAISE campaign_not_finished;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
('Invalid campaign title');
WHEN campaign_not_finished THEN
DBMS_OUTPUT.PUT_LINE
('Campaign not finished');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE
('It Fails for other reason');
COMMIT;
END delete_campaign;
is this right??
|
|
|
Re: what should i do?? - hints? [message #201003 is a reply to message #201002] |
Thu, 02 November 2006 04:04 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Please tell me the following:
Is your application designed in such a way that,when
datepaid IS NOT NULL AND campaignfinishdate IS NOT NULL , then only one such record is there in the table, campaign? if so then that code will work, else it will break..hope you see the reason..just try to run the code against the application and check it out..
|
|
|
Re: what should i do?? - hints? [message #201017 is a reply to message #201003] |
Thu, 02 November 2006 04:29 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
For example see the code below:
SQL> select * from staff;
STAFFNO STAFFNAME LINEMANAGERSTAFFNO
---------- ------------------------------ ------------------
1 Amir 6
2 John 6
3 Brian 5
4 Patel 5
5 Deborah
6 Sen
6 rows selected.
SQL> ed
Wrote file afiedt.buf
1 declare
2 v number;
3 begin
4 select staffno into v from staff;
5* end;
SQL> /
declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4
--WHY THIS ERROR? BECOZ STAFF TABLE HAS MORE THAN ONE RECORD..
|
|
|
|
Re: what should i do?? - hints? [message #201036 is a reply to message #201034] |
Thu, 02 November 2006 05:28 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Certainly this part:
SELECT title, datepaid, campaignfinishdate
INTO v_title, v_datepaid, v_campaignfinishdate
FROM campaign
WHERE datepaid IS NOT NULL
AND campaignfinishdate IS NOT NULL;
why: because if there are more than one records that get selected in this select condition then your code will break..right?
|
|
|
|
|
|
|
|
Re: what should i do?? - hints? [message #201079 is a reply to message #201075] |
Thu, 02 November 2006 07:49 |
orausern
Messages: 826 Registered: December 2005
|
Senior Member |
|
|
Unfortunately No! This does not require knowing the table or its columns, it requires knowing the application...we can help technically not functionally...again I suggest you talk to your senior collegue..
|
|
|
Re: what should i do?? - hints? [message #201244 is a reply to message #201036] |
Fri, 03 November 2006 04:39 |
hiip
Messages: 78 Registered: October 2006
|
Member |
|
|
am i on the right track
PROCEDURE delete_campaign(ctitle IN campaign.title%Type)
IS
v_datepaid campaign.datepaid%TYPE;
v_campaignfinishdate campaign.campaignfinishdate%Type;
v_title campaign.title%Type;
campaign_not_finished EXCEPTION;
BEGIN
SELECT title, datepaid, campaignfinishdate
INTO v_title, v_datepaid, v_campaignfinishdate
FROM campaign
WHERE datepaid = v_datepaid
AND campaignfinishdate = v_campaignfinishdate;
DELETE FROM advert
WHERE campaigntitle = ctitle;
DELETE FROM staffcampaign
WHERE title = ctitle;
DELETE FROM campaign
WHERE title = ctitle;
IF v_datepaid IS NULL THEN
RAISE campaign_not_finished;
END IF;
IF v_campaignfinishdate IS NULL THEN
RAISE campaign_not_finished;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
('Invalid campaign title');
WHEN campaign_not_finished THEN
DBMS_OUTPUT.PUT_LINE
('Campaign not finished');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE
('It Fails for other reason');
COMMIT;
END delete_campaign;
|
|
|
|
|
Re: what should i do?? - hints? [message #201305 is a reply to message #201284] |
Fri, 03 November 2006 07:49 |
Frank
Messages: 7901 Registered: March 2000
|
Senior Member |
|
|
amul wrote on Fri, 03 November 2006 13:47 | is this oracle code?buddy i think you are on the right track on the wrong train
|
could you point 5 things out that are NOT oracle-code??
3 ??
1 ??
ok, it may not be very elegant code, but it sure looks like PL/SQL to me.
And you might even fool Oracles PL/SQL parser!
[Updated on: Fri, 03 November 2006 07:50] Report message to a moderator
|
|
|
Re: what should i do?? - hints? [message #201965 is a reply to message #201244] |
Tue, 07 November 2006 10:41 |
Admin@Lightsql.Com
Messages: 36 Registered: November 2006
|
Member |
|
|
Why do you raise exception RAISE campaign_not_finished, instead of simply leaving the procedure? Do you want to handle such situation?
If you leave it simply, it will come out without issue. If you raise exception, you can not commit wherever the procedure is called unless you handle it exclusively.
Jayg
Fun Programming with Oracle & Visual C++
[Updated on: Wed, 08 November 2006 04:18] Report message to a moderator
|
|
|