所以我有一个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查询格式。我查看了其他答案,他们生成(非日期)随机数据,他们只是使用这种格式没有问题。
谢谢!
答案 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();