Reputation: 695
How to write a pl/sql with dynamic column and dynamic sort direction for example:-
select * from table order by "dynamic column" "dynamic sort order";
Upvotes: 0
Views: 1180
Reputation: 10421
You basically need to construct your sql command as a string and then execute it dynamically.
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
v_emp_cursor EmpCurTyp;
emp_record employees%ROWTYPE;
v_stmt_str VARCHAR2(200);
v_order VARCHAR2(30);
v_e_job employees.job%TYPE;
BEGIN
-- Dynamic SQL statement with placeholder:
v_order := 'emplid DESC';
v_stmt_str := 'SELECT * FROM employees WHERE job_id = :j ORDER BY ' || v_order;
-- Open cursor & specify bind argument in USING clause:
OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';
-- Fetch rows from result set one at a time:
LOOP
FETCH v_emp_cursor INTO emp_record;
EXIT WHEN v_emp_cursor%NOTFOUND;
END LOOP;
-- Close cursor:
CLOSE v_emp_cursor;
END;
/
Upvotes: 1
Reputation: 21851
You can use dynamic SQL & REF CURSORS to build queries dynamically
DECLARE
TYPE cur_typ IS ref CURSOR;
emp_rec_cursor CUR_TYP;
v_query_str VARCHAR2(2000);
v_sort_order VARCHAR2(10) := 'DESC';
v_column VARCHAR2(20) := 'NAME';
v_empid emp.empid%TYPE;
v_name emp.name%TYPE;
v_salary emp.salary%TYPE;
BEGIN
query_str := 'SELECT empid, name, salary FROM emp order by '
|| v_column -- reassign v_column as needed
|| ' '
|| v_sort_order; -- reassign v_sort_order as needed
OPEN emp_rec_cursor FOR query_str;
LOOP
FETCH emp_rec_cursor INTO v_empid, v_name, v_salary;
EXIT WHEN emp_rec_cursor %NOTFOUND;
-- process row here
END LOOP;
CLOSE emp_rec_cursor;
END;
Upvotes: 0