This section explains the flow of DBMS_SQL and provides an example.
Flow of DBMS_SQL

Example
CREATE FUNCTION smp_00()
RETURNS INTEGER
AS $$
DECLARE
str_sql VARCHAR(255);
cursor INTEGER;
h_smpid INTEGER;
v_smpid INTEGER;
v_smpnm VARCHAR(20);
v_smpage INTEGER;
errcd INTEGER;
length INTEGER;
ret INTEGER;
BEGIN
str_sql := 'SELECT smpid, smpnm, smpage FROM smp_tbl WHERE smpid < :H_SMPID ORDER BY smpid';
h_smpid := 3;
v_smpid := 0;
v_smpnm := '';
v_smpage := 0;
cursor := DBMS_SQL.OPEN_CURSOR();
PERFORM DBMS_SQL.PARSE(cursor, str_sql, 1);
PERFORM DBMS_SQL.BIND_VARIABLE(cursor, ':H_SMPID', h_smpid);
PERFORM DBMS_SQL.DEFINE_COLUMN(cursor, 1, v_smpid);
PERFORM DBMS_SQL.DEFINE_COLUMN(cursor, 2, v_smpnm, 10);
PERFORM DBMS_SQL.DEFINE_COLUMN(cursor, 3, v_smpage);
ret := DBMS_SQL.EXECUTE(cursor);
loop
if DBMS_SQL.FETCH_ROWS(cursor) = 0 then
EXIT;
end if;
SELECT value,column_error,actual_length INTO v_smpid,errcd,length FROM DBMS_SQL.COLUMN_VALUE(cursor, 1, v_smpid);
RAISE NOTICE '--------------------------------------------------------';
RAISE NOTICE '--------------------------------------------------------';
RAISE NOTICE 'smpid = %', v_smpid;
RAISE NOTICE 'errcd = %', errcd;
RAISE NOTICE 'length = %', length;
SELECT value,column_error,actual_length INTO v_smpnm,errcd,length FROM DBMS_SQL.COLUMN_VALUE(cursor, 2, v_smpnm);
RAISE NOTICE '--------------------------------------------------------';
RAISE NOTICE 'smpnm = %', v_smpnm;
RAISE NOTICE 'errcd = %', errcd;
RAISE NOTICE 'length = %', length;
select value,column_error,actual_length INTO v_smpage,errcd,length FROM DBMS_SQL.COLUMN_VALUE(cursor, 3, v_smpage);
RAISE NOTICE '--------------------------------------------------------';
RAISE NOTICE 'smpage = %', v_smpage;
RAISE NOTICE 'errcd = %', errcd;
RAISE NOTICE 'length = %', length;
RAISE NOTICE '';
end loop;
cursor := DBMS_SQL.CLOSE_CURSOR(cursor);
RETURN 0;
END;
$$ LANGUAGE plpgsql;