如何使用 Oracle [=11g=] 开发人员或其他工具 populate/fill 使用 Oracle 11g [=12c=] 中的随机数据?
How to populate/fill with random data an Oracle 11g table with Oracle SQL developer or other tool?
我们有几个 table 想要测试,为了节省时间,用随机数据填充它们会很有帮助。
我们不要求数据有意义。它可以是行内的任何字符串或任何日期。
因为我们处于开发过程中数据库架构经常更改的阶段,所以我们不想创建自己的 INSERT 语句。
相反,我们正在寻找一种可以自动为任何 table 执行此操作的工具。
作为开始,您可以使用
简单地生成值
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)
如果您没有 CREATE PROCEDURE
.
的权限,您可以将过程变成匿名 PL/SQL 块
我们有几个 table 想要测试,为了节省时间,用随机数据填充它们会很有帮助。 我们不要求数据有意义。它可以是行内的任何字符串或任何日期。
因为我们处于开发过程中数据库架构经常更改的阶段,所以我们不想创建自己的 INSERT 语句。
相反,我们正在寻找一种可以自动为任何 table 执行此操作的工具。
作为开始,您可以使用
简单地生成值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)
如果您没有 CREATE PROCEDURE
.