PROCEDURE fetch_table_data
( table_name IN varchar2)
IS
statement_cursor integer;
row_selected number;
v_first_name employees.first_name%type;
v_last_name employees.last_name%type;
BEGIN
statement_cursor := dbms_sql.open_cursor;
dbms_sql.parse(statement_cursor,
'select first_name, last_name from employees',
dbms_sql.native);
DBMS_SQL.DEFINE_COLUMN(statement_cursor, 1, v_first_name, 100);
DBMS_SQL.DEFINE_COLUMN(statement_cursor, 2, v_last_name, 100);
row_selected := dbms_sql.execute(statement_cursor);
LOOP
IF DBMS_SQL.FETCH_ROWS(statement_cursor)>0 THEN
-- get column values of the row
DBMS_SQL.COLUMN_VALUE(statement_cursor, 1, v_first_name);
DBMS_SQL.COLUMN_VALUE(statement_cursor, 2, v_last_name);
dbms_output.put_line(v_first_name||' '||v_last_name);
else
exit;
end if;
end loop;
dbms_sql.close_cursor(statement_cursor);
END; -- Procedure
PROCEDURE fetch_table_data
( p_first_name IN varchar2 default null,
p_last_name IN varchar2 default null,
p_department_name in varchar2 default null
)
IS
statement_cursor integer;
row_selected number;
v_first_name employees.first_name%type;
v_last_name employees.last_name%type;
v_department_name departments.department_name%type;
v_sql VARCHAR2(1000);
BEGIN
v_sql := 'select first_name, last_name, department_name
from employees e join departments d
on d.department_id = e.department_id where '||chr(10);
if p_first_name is not null then
-- https://xkcd.com/327/
v_sql := v_sql || ' first_name = '''|| p_first_name
||''' and '||chr(10);
end if;
if p_last_name is not null then
v_sql := v_sql || ' last_name = :b_last_name and ' ||chr(10);
end if;
if p_department_name is not null then
v_sql := v_sql || ' department_name = :b_department_name and '
||chr(10);
end if;
v_sql := v_sql || ' 1=1'; -- zum gueltig machen aller SQL statments!!!
dbms_output.put_line(v_sql);
statement_cursor := dbms_sql.open_cursor;
dbms_sql.parse(statement_cursor,
v_sql,
dbms_sql.native);
DBMS_SQL.DEFINE_COLUMN(statement_cursor, 1, v_first_name, 100);
DBMS_SQL.DEFINE_COLUMN(statement_cursor, 2, v_last_name, 100);
DBMS_SQL.DEFINE_COLUMN(statement_cursor, 3, v_department_name, 100);
if p_last_name is not null then
DBMS_SQL.BIND_VARIABLE(statement_cursor, 'b_last_name', p_last_name);
end if;
if p_department_name is not null then
DBMS_SQL.BIND_VARIABLE(statement_cursor, 'b_department_name',
p_department_name);
end if;
row_selected := dbms_sql.execute(statement_cursor);
LOOP
IF DBMS_SQL.FETCH_ROWS(statement_cursor)>0 THEN
DBMS_SQL.COLUMN_VALUE(statement_cursor, 1, v_first_name);
DBMS_SQL.COLUMN_VALUE(statement_cursor, 2, v_last_name);
DBMS_SQL.COLUMN_VALUE(statement_cursor, 3, v_department_name);
dbms_output.put_line(v_first_name||' '||v_last_name||' '||
v_department_name);
else
exit;
end if;
end loop;
-- dbms_sql.close_cursor(statement_cursor);
END; -- Procedure