Sometimes there is a need to pass dynamic number of inputs to a query, based on conditions satisfied or data from some other source/query, as the program executes. Here, we will see how to pass dynamic/unknown number of inputs to a query.
Let's see how to do it. We assume a situation where we get inputs, to be passed to a dynamic query, from a different select query.
DECLARE
CURSOR c_fetch_ids IS SELECT ids FROM employee WHERE name LIKE 'John %'; v_counter NUMBER; d NUMBER; v_dyn_stmt VARCHAR2(1000); v_cur NUMBER; v_temp employee.ids%TYPE; v_tab_ids DBMS_SQL.NUMBER_TABLE; bind_names DBMS_SQL.VARCHAR2_TABLE; v_names DBMS_SQL.VARCHAR2_TABLE; v_salaries DBMS_SQL.NUMBER_TABLE; BEGIN
v_counter := 0; OPEN c_fetch_ids; LOOP
FETCH c_fetch_ids INTO v_temp; EXIT WHEN c_fetch_ids%NOTFOUND; v_counter := v_counter+1; v_tab_ids(v_counter) := v_temp; END LOOP;
CLOSE c_fetch_ids; v_dyn_stmt := 'SELECT name, salary FROM employee WHERE ids IN ('; FOR v_counter IN 1 .. v_tab_ids.count LOOP bind_names(v_counter) := v_counter; IF v_counter=1 THEN v_dyn_stmt := v_dyn_stmt||' :1'; ELSE
v_dyn_stmt := v_dyn_stmt||' ,:'||v_counter; END IF; END LOOP; v_dyn_stmt := v_dyn_stmt||')'; v_cur := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_cur, v_dyn_stmt, DBMS_SQL.NATIVE); for v_counter IN 1 .. v_tab_ids.count LOOP DBMS_SQL.BIND_VARIABLE(v_cur,bind_names(v_counter),v_tab_ids(v_counter)); END LOOP; DBMS_SQL.DEFINE_ARRAY(v_cur, 1, v_names, 10, 1); DBMS_SQL.DEFINE_ARRAY(v_cur, 2, v_salaries, 10, 1); d := DBMS_SQL.EXECUTE(v_cur); LOOP d := DBMS_SQL.FETCH_ROWS(v_cur); DBMS_SQL.COLUMN_VALUE(v_cur, 1, v_names); DBMS_SQL.COLUMN_VALUE(v_cur, 2, v_salaries); EXIT WHEN d!=10; END LOOP; DBMS_SQL.CLOSE_CURSOR(v_cur); END;
The above block fetches names and salaries of employees, 10 at a time, after taking dynamic number of inputs(ids) which come from a different query with the condition that name should be starting as 'John %'.
For more info visit
No comments:
Post a Comment