This is a simple stored procedure which will export the current database to the specified directory without locking the database. While this is a very simple procedure it can be extend very easily to accommodate parallel unloads based on the size of a table, scan tables in parallel and many other ways to customize this produce for your own needs.
CREATE FUNCTION export_system(load_dir VARCHAR(50) ) RETURNING INTEGER, INTEGER DEFINE rc INTEGER; DEFINE bad INTEGER; DEFINE create_ext_tab LVARCHAR(8192); DEFINE ins LVARCHAR(512); DEFINE drop_ext_tab LVARCHAR(512); DEFINE tname VARCHAR(250); DEFINE dbschema LVARCHAR(1024); DEFINE dbname VARCHAR(250); DEFINE numrows INTEGER; LET rc=0; LET bad=0; LET dbname = DBINFO("dbname"); LET dbschema = "dbschema -q -d "||TRIM(dbname)||" -it DR -ss "|| TRIM(load_dir)||"/"||TRIM(dbname)||".sql"; SYSTEM dbschema; SET ISOLATION TO DIRTY READ; FOREACH SELECT TRIM(tabname) ,nrows INTO tname,numrows FROM systables WHERE tabid >99 AND tabtype = "T" LET create_ext_tab = "CREATE EXTERNAL TABLE "||tname||"_ext "|| " SAMEAS "||tname||" USING (" || "DATAFILES('DISK:"||load_dir||"/"||tname||".unl'),"|| "FORMAT 'DELIMITED', "|| "DELIMITER '|', "|| "RECORDEND '', "|| "DELUXE, ESCAPE, "|| "NUMROWS "|| numrows+1||", "|| "MAXERRORS 100, "|| "REJECTFILE '"||load_dir||"/"||tname||".reject' " || " )"; LET ins = "INSERT INTO "||tname||"_ext SELECT * FROM "||tname; LET drop_ext_tab = "DROP TABLE "||tname||"_ext"; EXECUTE IMMEDIATE create_ext_tab; EXECUTE IMMEDIATE ins; EXECUTE IMMEDIATE drop_ext_tab; LET rc = rc + 1; END FOREACH RETURN rc, bad; END FUNCTION;