| 
		
			| procedures parameters [message #36335] | Fri, 16 November 2001 10:14  |  
			| 
				
				
					| chandra shekar Messages: 3
 Registered: November 2001
 | Junior Member |  |  |  
	| could anyone please help me how to use a parameter value in a "SELECT * FROM EMP WHERE EMPNO IN (parameter_value)" in inside a procedure. for ex:
 procedure ex(val varchar2)
 begin
 -- val can be like '100,200,300' or '100','200','300'
 select * from emp where empno in (val);
 end;
 
 I will be passing val dynamically and I need to get results.
 
 thanks
 
 ----------------------------------------------------------------------
 |  
	|  |  | 
	| 
		
			| Re: procedures parameters [message #36340 is a reply to message #36335] | Sun, 18 November 2001 06:57   |  
			| 
				
				
					| Rae Messages: 1
 Registered: November 2001
 | Junior Member |  |  |  
	| Hi, try dynamic sql , or native depending if you are on 8i+.
 
 ==================================================
 CREATE OR REPLACE PROCEDURE Ex(pVal IN VARCHAR2)
 IS
 
 dynSql    dbms_sql.varchar2s;
 dynCur    PLS_INTEGER;
 execValue PLS_INTEGER;
 
 BEGIN
 
 dynCur := DBMS_SQL.OPEN_CURSOR;
 
 dynSql.DELETE;
 dynSql(0)  := 'select * from emp where emp_no in ('||pVal||') ';
 
 -- Display sql created
 
 dbms_output.put_line(dynSql(0));
 
 DBMS_SQL.PARSE(dynCur, dynSql, dynSql.FIRST, dynSql.LAST, TRUE, DBMS_SQL.NATIVE);
 execValue := DBMS_SQL.EXECUTE(dynCur);
 
 dynSql.DELETE;
 DBMS_SQL.CLOSE_CURSOR(dynCur);
 
 EXCEPTION
 WHEN OTHERS THEN
 RAISE;
 END;
 /
 ==================================================
 Have fun
 
 Rae
 
 
 
 ----------------------------------------------------------------------
 |  
	|  |  | 
	| 
		
			| Re: procedures parameters [message #36353 is a reply to message #36335] | Mon, 19 November 2001 11:29  |  
			| 
				
				
					| andrew again Messages: 2577
 Registered: March 2000
 | Senior Member |  |  |  
	| 
if you want to return the results of the select,
then you need a bit more complexity. Also,
dbms_sql is difficult to work with and a bit
outdated for what you want.
CREATE TABLE ABC (A  NUMBER);
insert into abc values(1);
insert into abc values(9);
insert into abc values(13);
insert into abc values(999);
CREATE OR REPLACE PACKAGE ref_cur_tst
IS
   TYPE t_cur IS REF CURSOR; 
   PROCEDURE get_abc (cv_cur IN OUT t_cur, p_list IN varchar2);
END ref_cur_tst;
/
CREATE OR REPLACE PACKAGE BODY ref_cur_tst
AS
   PROCEDURE get_abc (cv_cur IN OUT t_cur, p_list IN varchar2)
   IS
   BEGIN
      OPEN cv_cur FOR 'SELECT a FROM abc where a in ('||p_list||')';
   END get_abc;
END ref_cur_tst;
/
set serveroutput on;
DECLARE
   a       abc.a%TYPE;
   cv_c1   ref_cur_tst.t_cur;
   p_list  varchar2(20) := '1, 9';
BEGIN
   ref_cur_tst.get_abc (cv_c1, p_list);
   LOOP
      FETCH cv_c1 INTO a;
      EXIT WHEN cv_c1%NOTFOUND;
      DBMS_OUTPUT.put_line (a);
   END LOOP;
   CLOSE cv_c1;
END;
/
the way I've shown here is frowned upon because it doesn't use bind variables, so worse performance.
see this link too:
 http://asktom.oracle.com/pls/ask/f?p=4950:8:254370::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:210612357425,
 
 ----------------------------------------------------------------------
 |  
	|  |  |