DBMS_SQLの各機能のフローと使用例を示します。
DBMS_SQLのフロー
使用例
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;