sql >> Database >  >> RDS >> Oracle

Hoe een waarde in een geneste tabel invoegen zonder gegevens in die tabel te verliezen?

Gebruik de MULTISET UNION [ALL|DISTINCT] operator:

SQL Fiddle

Oracle 11g R2 Schema-instellingen :

CREATE OR REPLACE TYPE businessTableForCategories AS TABLE OF VARCHAR(128);
/

CREATE TABLE Category (
name                    VARCHAR(128) PRIMARY KEY,
businesses              businessTableForCategories
) NESTED TABLE businesses STORE AS categoryBusinessTable
/

INSERT INTO Category VALUES (
  'Restaurant',
  businessTableForCategories('xzqpehc234ajdpa8')
)
/

UPDATE Category
SET businesses = businesses
                 MULTISET UNION ALL 
                 businessTableForCategories('other_value')
WHERE name = 'Restaurant'
/

Query 1 :

SELECT *
FROM   category

Resultaten :

|       NAME |                   BUSINESSES |
|------------|------------------------------|
| Restaurant | xzqpehc234ajdpa8,other_value |

Vraag 2 :

Of gebruik een bindvariabele om de verzameling in de query op te nemen:

DECLARE
  businesses businessTableForCategories := businessTableForCategories();
BEGIN
  businesses.EXTEND( 10000 );
  FOR i IN 1 .. 10000 LOOP
    businesses(i) := DBMS_RANDOM.STRING( 'x', 128 );
  END LOOP;
  INSERT INTO Category VALUES ( 'lots of data', businesses );
END;

Vraag 3 :

SELECT name, CARDINALITY( businesses )
FROM   Category

Resultaten :

|         NAME | CARDINALITY(BUSINESSES) |
|--------------|-------------------------|
| lots of data |                   10000 |
|   Restaurant |                       2 |



  1. De maximale lengte van VARCHAR is 4000, maar er kan slechts 2666 bytes lange Thaise tekst worden opgeslagen

  2. Moet u altijd samenvoegen gebruiken in een WAAR als er null/lege waarden kunnen zijn in de kolommen die u vergelijkt?

  3. NANVL() Functie in Oracle

  4. Is er een MySQL-aggregaatfunctie voor BEVAT?