2016-07-01 4 views

Antwort

0

Diese Lösung funktioniert für mich:

INSERT INTO test_table(column_1, column_2) 
    WITH x AS (SELECT /*+ MATERIALIZE */ DBMS_CRYPTO.RANDOMBYTES(16) as val FROM dual) 
    SELECT val, val 
    FROM x; 

Dank Husqvik & Gordon Linoff.

3

Eine Option ist skalare Unterabfrage Caching zu verwenden:

INSERT INTO test_table (column_1, column_2) 
SELECT random, random FROM 
    (SELECT (SELECT dbms_crypto.randombytes(16) FROM dual) random FROM dual); 

Oder mit PL/SQL:

DECLARE 
    random RAW(16) := dbms_crypto.randombytes(16); 
BEGIN 
    INSERT INTO test_table (column_1, column_2) VALUES (random, random); 
END; 
+0

Die SQL-Anweisung funktioniert nicht - fügt zwei verschiedene Werte ein. – trunkc

+0

PL/SQL funktioniert sicher. Die erste basiert auf der Skalar-Unterabfrage-Zwischenspeicherung. Wenn es aus irgendeinem Grund nicht angewendet wird, erhalten Sie andere Werte. – Husqvik

1

Verwenden einer Unterabfrage:

INSERT INTO test_table(column_1, column_2) 
    SELECT val, val 
    FROM (SELECT DBMS_CRYPTO.RANDOMBYTES(16) as val FROM dual) x; 

Oder diese geschrieben werden können wie:

INSERT INTO test_table(column_1, column_2) 
    WITH x AS (SELECT DBMS_CRYPTO.RANDOMBYTES(16) as val FROM dual) 
    SELECT val, val 
    FROM x; 
+0

funktioniert nicht - fügt zwei verschiedene Werte ein. – trunkc

+0

@trunkc. . . Das scheint sehr seltsam zu sein. Versuchen Sie es mit 'mit'. –

+0

das mit der Variante funktioniert – trunkc

1

Sie könnten eine temporäre Tabelle erstellen, um sie zu speichern?

set echo on 
create table test_table (column_1 varchar2(100), column_2 varchar2(100)); 

create global temporary table rando_val (c1 varchar2(100)); 

insert 
into rando_val 
values (dbms_crypto.randombytes(16)); 

INSERT INTO test_table (column_1, column_2) 
select c1, 
     c1 
from rando_val; 

commit; 

select * 
from test_table; 

Nicht alles so elegant, aber es sollte funktionieren.

1

diese seltsame Abfrage

select /*+ NO_XML_QUERY_REWRITE */ UTL_RAW.CAST_TO_RAW(VAL1),UTL_RAW.CAST_TO_RAW(VAL2) from 
     xmltable('for $c in . return <r><val1>{$c}</val1><val2>{$c}</val2></r>' 
        passing (SELECT UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.RANDOMBYTES(16)) as val FROM dual) 
      columns 
      "VAL1" varchar2(300) path '/r/val1', 
      "VAL2" varchar2(300) path '/r/val2') 

Versuche Wenn Sie dann nicht verdeckte varchar2 zu roh wollen wieder in letzten Schritt. Dies bedeutet

UTL_RAW.CAST_TO_RAW(VAL1) 
Verwandte Themen