Scenario: PK Generation by DB

A scenario with two tables mapping to a document with a sub-document. The interesting bit is a trigger that always assigns a value to the PK, no matter what is passed in.

Goal: Show how a primary key generated by a trigger in the database will work with dependent objects requiring that PK value for a foreign key.

!!! NOT SUPPORTED !!!
This scenarios is complicated and requires generation of PL/SQL to get the value of the generated PK. Additionally, given it's anonymous PL/SQL it gets tricky to send the generated key to the lightblue application code. Therefore this scenario is not recommended for support at this time.

Contents:

Setup

Schema: Oracle

Create Table BASE (
  ID NUMBER(19) NOT NULL,
  A_FIELD VARCHAR2(256),
  PRIMARY KEY (ID)
);
/

CREATE SEQUENCE BASE_SEQ
    START WITH 1
    INCREMENT BY 1
    NOMAXVALUE;
/

CREATE TRIGGER BASE_TRIGGER
  BEFORE INSERT ON BASE
  FOR EACH ROW
DECLARE
BEGIN
  :new.ID := BASE_SEQ.nextval;
END BASE_TRIGGER;
/

Create Table SUB_DOCUMENT (
  BASE_ID NUMBER(19) NOT NULL,
  S_FIELD VARCHAR2(256),
  FOREIGN KEY (BASE_ID) REFERENCES BASE(ID)
);

Schema: lightblue

{
    "entityInfo": {
        "datastore": {
            "backend": "rdbms",
            "datasource": "my_datasource",
            "dialect": "oracle"
        },
        "name": "pkGeneration"
    },
    "schema": {
        "name": "pkGeneration",
        "status": {
            "value": "active"
        },
        "version": {
            "value": "0.1.0"
        },
        "fields": {
            "id": {
                "type": "integer",
                "constraints": {
                    "identity": true,
                    "generated": true
                },
                "rdbms": {
                    "table": "BASE",
                    "column": "ID"
                }
            },
            "a": {
                "type": "string",
                "constraints": {
                    "maxLength": 256
                },
                "rdbms": {
                    "table": "BASE",
                    "column": "A_FIELD"
                }
            },
            "subDocument": {
                "type": "object",
                "fields": {
                    "s": {
                        "type": "string",
                        "constraints": {
                            "maxLength": 256
                        },
                        "rdbms": {
                            "table": "SUB_DOCUMENT",
                            "column": "S_FIELD"
                        }
                    }
                }
            }
        }
    }
}

insert

lightblue request

PUT /data/insert/pkGeneration/0.1.0
{
    "objectType": "pkGeneration",
    "version": "0.1.0",
    "data": [
        {
            "a": "something",
            "subDocument": {
                "s": "something else"
            }
        }
    ],
    "projection": [
        {
            "field": "*",
            "include": true
        }
    ]
}

generated SQL

DECLARE
    V_ID NUMBER(19);
BEGIN
    INSERT INTO BASE (A_FIELD)
    VALUES ('something')
    RETURNING ID INTO V_ID;

    INSERT INTO SUB_DOCUMENT (BASE_ID, S_FIELD)
    VALUES (V_ID, 'something else');
END
/

/* how do we get the ID returned? */

lightblue response

{
    "status": "complete",
    "modifiedCount": 1,
    "matchCount": 1,
    "processed": [
        {
            "id": 1,
            "a": "something",
            "subDocument": {
                "s": "something else"
            }
        }
    ]
}

results matching ""

    No results matching ""