Link to home
Start Free TrialLog in
Avatar of chalie001
chalie001

asked on

ora-01795: maximum number of expression in a list is 1000

hi i have the following query

select * from cal_obj
where obj_name in ('obj1','obj3' etc) I have more tha 1000+ obj how can I work around this after I get this values I also what to delete tham am in 11gr2
Avatar of slightwv (䄆 Netminder)
slightwv (䄆 Netminder)

Break them up into several lists:

where
(
obj_name in ('obj1','obj3' etc)
or
obj_name in ('obj1001','obj1003' etc)
)
...

or

Place all the objects in a temp table then do:
where obj_name in (select tmp_object_name from tmp_object_table) ...


There are a couple of other ways but those are probably the most straight forward.

>> I also what to delete tham am in 11gr2

Change the outer most select to a delete?
SOLUTION
Avatar of Sean Stuber
Sean Stuber

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of chalie001

ASKER

how can i do this in better way

CREATE OR REPLACE TYPE         "VARCHAR2TABLE"                                          AS TABLE OF VARCHAR2(50)

CREATE OR REPLACE FUNCTION SMS01.F_VARCHAR2_TABLE (ccode_list       IN  VARCHAR2,
     p_delimiter  IN  VARCHAR2 DEFAULT ',')
RETURN varchar2Table
PIPELINED
   IS
      v_string  LONG := ccode_list || p_delimiter;
      v_pos     PLS_INTEGER;
      v_data      varchar2Table :=  varchar2Table();
    BEGIN
     LOOP
       v_pos := INSTR(v_string, p_delimiter);
       EXIT WHEN (NVL(v_pos, 0) = 0);
       v_data.extend;
       v_data(v_data.COUNT) := trim(SUBSTR(v_string, 1, v_pos - 1));
       v_string := SUBSTR(v_string, v_pos + 1);
     END LOOP;
     RETURN ;
   END F_varchar2_Table;
/


CREATE OR REPLACE PROCEDURE SMS01.SMS_SUSPEND_BYCCODE (p_ccode VARCHAR)
IS
--procedure to suspend by ccode and exclude  from a pay run
CURSOR get_agree IS
SELECT a.id aid, a.ssch_id, a.contract_no, b.id ayea_id, b.asta_id, b.status_date, b.comments
FROM SMS_AGREEMENTS a,
SMS_AGREEMENT_YEARS b,
SMS_PARTIES par
WHERE a.id = b.agr_id
AND b.fyea_year = 2011
AND par.id = a.par_id
AND  par.c_code IN (SELECT *  FROM TABLE(cast(F_Varchar2_Table_Pipe(p_ccode)AS VARCHAR2TABLE)));

cnt INTEGER;

BEGIN

cnt := 0;

SELECT COUNT(*) INTO cnt FROM SMS_AGREEMENTS a,
SMS_AGREEMENT_YEARS b,
SMS_PARTIES par
WHERE a.id = b.agr_id
AND b.fyea_year = 2011
AND par.id = a.par_id
AND par.C_CODE IN (SELECT *  FROM TABLE(cast(F_Varchar2_Table_Pipe(p_ccode)AS VARCHAR2TABLE)));

cnt := 0 ;


    FOR agree_rec IN get_agree LOOP
	cnt := cnt + 1;

        UPDATE SMS_AGREEMENT_YEARS
        SET asta_id = 2444,
        --comments = 'UNSUSPEND ON REQUEST BY MICHAEL'
		 comments = 'SUSPEND ON REQUEST BY MICHAEL'
        WHERE id = agree_rec.ayea_id;
    END LOOP;
	COMMIT;

	dbms_output.put_line('data records updated ' || cnt);


END Sms_Suspend_Byccode;
/

Open in new window

ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
correct