Just as a start you can simply generate values using
CREATE OR REPLACE PROCEDURE fill_table(tableName IN VARCHAR2, owner IN VARCHAR2 DEFAULT USER, rowCount IN INTEGER DEFAULT 1)
IS
commmandText clob;
selectList clob;
columnList clob;
columnExpression VARCHAR2(255);
separator VARCHAR2(2);
BEGIN
IF rowCount <= 0 THEN RETURN; END IF;
FOR columnData IN (SELECT column_name, data_type, data_precision precision, data_length, ROWNUM rn FROM all_tab_cols WHERE owner = fill_table.owner AND table_name = tableName AND column_id IS NOT NULL) LOOP
columnExpression :=
CASE columnData.data_type
WHEN 'NUMBER' THEN 'dbms_random.value * ' || NVL(columnData.precision, POWER(10, 8))
WHEN 'VARCHAR2' THEN 'dbms_random.string(''X'', ' || columnData.data_length || ')'
WHEN 'DATE' THEN 'SYSDATE - dbms_random.value * 365'
-- Add other types
END;
columnList := columnList || separator || '"' || columnData.column_name || '"';
selectList := selectList || separator || columnExpression || CHR(10);
separator := ', ';
END LOOP;
commmandText := 'INSERT INTO ' || owner || '.' || tableName || ' (' || columnList || ')' || CHR(10) || ' SELECT ' || selectList || 'FROM dual CONNECT BY LEVEL <= ' || rowCount;
--dbms_output.put_line(commmandText);
EXECUTE IMMEDIATE commmandText;
END;
/
EXEC fill_table('TEST_DATA', rowCount => 3)
You can turn the procedure into anonymous PL/SQL blocks if you don't have privileges to CREATE PROCEDURE
.