SQL:使用随机测试数据填充日期列 - 如何为表中的每条记录运行子查询?

时间:2015-11-25 12:26:13

标签: oracle random plsql

所以我有一个oracle 11g SQL db。它有一个包含日期字段的表。我刚添加了该字段,因此它目前不包含任何数据。

╔═════════╦═══════════╗
║ some_id ║ some_date ║
╠═════════╬═══════════╣
║ 1       ║ null      ║
╠═════════╬═══════════╣
║ 2       ║ null      ║
╠═════════╬═══════════╣
║ 3       ║ null      ║
╚═════════╩═══════════╝

我写了一个快速查询,在我们的测试环境中生成一些测试数据:

update some_table 
set some_date =(SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J') FROM DUAL)
where some_id = any(select some_other_id from vw_some_complicated_view);

现在这个子查询可能不那么优雅,会在一个范围内生成一个随机日期:

SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J') FROM DUAL

所以我希望这个子查询为表中的每个记录运行...换句话说,我想将每个日期设置为随机日期 - 但不是相同的随机日期。

我得到了什么:

╔═════════╦═══════════╗
║ some_id ║ some_date ║
╠═════════╬═══════════╣
║ 1       ║ 08-DEC-15 ║
╠═════════╬═══════════╣
║ 2       ║ 08-DEC-15 ║
╠═════════╬═══════════╣
║ 3       ║ 08-DEC-15 ║
╚═════════╩═══════════╝

我想要的是什么:

╔═════════╦═══════════╗
║ some_id ║ some_date ║
╠═════════╬═══════════╣
║ 1       ║ 04-JAN-16 ║
╠═════════╬═══════════╣
║ 2       ║ 20-DEC-15 ║
╠═════════╬═══════════╣
║ 3       ║ 03-MAR-16 ║
╚═════════╩═══════════╝

我如何实现这一点,最好采用普通的SQL查询格式。我查看了其他答案,他们生成(非日期)随机数据,他们只是使用这种格式没有问题。

谢谢!

4 个答案:

答案 0 :(得分:1)

Try this below code. It may help you to generate the random date.

--Creation of dummy table
CREATE TABLE RANDOM_TEST
  ( num NUMBER, DATE_COL DATE
  );


--IOnsertion of  dummy data
INSERT INTO RANDOM_TEST
SELECT LEVEL,NULL FROM DUAL
CONNECT BY LEVEL < 10;


-- Updating values with some random data
MERGE INTO RANDOM_TEST rt USING
(SELECT NUM FROM RANDOM_TEST
)A ON (rt.num = a.num)
WHEN MATCHED THEN
  UPDATE SET DATE_COL = SYSDATE+A.num;

COMMIT;

答案 1 :(得分:1)

当使用标量子查询时,一旦用于更新中的每一行,该语句就会被解析。但是,如果子查询针对主查询的每一行进行了更改,则会为每一行解析并执行该标量子查询,并将新值用于该行。

原始场景

SQL> CREATE TABLE test_skg1(some_id NUMBER, some_date DATE)
  2  /

Table created

SQL> 
SQL> INSERT INTO test_skg1 VALUES (1, NULL);

1 row inserted
SQL> INSERT INTO test_skg1 VALUES (2, NULL);

1 row inserted
SQL> INSERT INTO test_skg1 VALUES (3, NULL);

1 row inserted

SQL> SELECT * FROM test_skg1;

   SOME_ID SOME_DATE
---------- -----------
         1 
         2 
         3 

SQL> 
SQL> UPDATE test_skg1
  2    SET some_date = (SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J') FROM DUAL)
  3  /

3 rows updated

SQL> SELECT * FROM test_skg1;

   SOME_ID SOME_DATE
---------- -----------
         1 3/1/2016
         2 3/1/2016
         3 3/1/2016

SQL> ROLLBACK;

Rollback complete

更新:标量子查询更改了主查询的每一行,我在主查询中添加了some_id,以便每行都有不同的标量子查询。< / p>

SQL> UPDATE test_skg1 a
  2  SET a.some_date = (SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01' + a.some_id,'J'))),'J') FROM DUAL);

3 rows updated
SQL> SELECT * FROM test_skg1;

   SOME_ID SOME_DATE
---------- -----------
         1 12/28/2015
         2 6/24/2016
         3 2/17/2016
SQL> ROLLBACK;

Rollback complete

现在我直接调用该函数,而不使用子查询..

SQL> UPDATE test_skg1
  2    SET some_date = TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J')
  3  /

3 rows updated

SQL> SELECT * FROM test_skg1;

   SOME_ID SOME_DATE
---------- -----------
         1 7/15/2016
         2 4/15/2016
         3 6/11/2016

SQL> 

每次生成新值时,因为标量子查询没有依赖性。

答案 2 :(得分:0)

对于插入,您可以使用

insert into test_table
SELECT level,TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J') FROM DUAL
connect by level<100;

更新你可以试试这个......

 UPDATE vish_test a
  SET a.idate = (SELECT TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2015-12-01','J'),TO_CHAR(DATE '2016-08-01','J'))),'J') FROM DUAL)
 where rank_id in(select rank_id from vish_test);

答案 3 :(得分:-3)

您使用带有游标的Plsql程序并使用where条件更新行 如下 只需添加光标并尝试一次

CertificateFactory cf = CertificateFactory.getInstance("X.509");
caInput = new BufferedInputStream(getMyContext().getResources().openRawResource(R.raw.proxyserver));
Certificate ca = cf.generateCertificate(caInput);

String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, tmf.getTrustManagers(), null);

URL url = new URL("https://192.168.1.177:443");
conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(context.getSocketFactory());
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
conn.connect();