创建过程以在 Oracle SQL 中插入行 & Return SYS_GUID() PK
Create Procedure to Insert row & Return SYS_GUID() PK in Oracle SQL
我的团队有两个 Oracle DB tables - 一个用于捕获服务调用请求和响应,另一个用于记录某些类型的错误。目前这两个 table 没有关联。他们都使用 DEFAULT SYS_GUID() 在插入时生成他们的 PK - 但其中一个将其存储为 raw(16),另一个存储为 varchar2(50 BYTE).
我正在创建一个 table,其中每个 table 都有一个 FK,并且通过一致投票,我需要使用 SYS_GUID() 作为 PK .
工作禁止在此处粘贴代码,因此粗略的示例代码如下,假设 typos/weird 格式不存在于 code/scripts 中:
table SERVICE_CALLS
SERVICE_CALL_ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
REQUEST_DATETIME DATE NOT NULL,
RESPONSE_DATETIME DATE,
REQUEST_PAYLOAD CLOB,
RESPONSE_PAYLOAD CLOB
table ERROR_LOGS
ERROR_LOG_ID VARCHAR2(50 BYTE) DEFAULT SYS_GUID() PRIMARY KEY,
ERROR_TIMESTAMP TIMESTAMP(6) NOT NULL,
ERROR_TEXT CLOB NOT NULL
我的新table:
table SERVICE_CALL_ERROR_LOG_RELATION
RELATION_ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
INSERT_TIMESTAMP TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
SERVICE_CALL_ID RAW(16) NOT NULL,
ERROR_LOG_ID CARCHAR2(50 BYTE) NOT NULL,
CONSTRAINT FK_SERVICE_CALL
FOREIGN KEY (SERVICE_CALL_ID),
REFERENCES SERVICE_CALLS(SERVICE_CALL_ID),
CONSTRAINT FK_ERROR_LOG
FOREIGN KEY (ERROR_LOG_ID)
REFERENCES ERROR_LOGS (ERROR_LOG_ID);
ERROR_LOG 将与 SERVICE_CALL 具有多对一关系,但并非每个 ERROR_LOG 都具有关联的 SERVICE_CALL。只有在 SERVICE_CALL_ID 可用时创建了 ERROR_LOG,关系 table 才会被填充;可用性将在实际应用中确定。如果没有 SERVICE_CALL_ID,我们将只在 ERROR_LOGS table 中插入一条记录,而不触及 RELATION table.
我对存储过程没有太多经验,但我的目标是创建一个存储过程,它将接收 SERVICE_CALL_ID(null 或 raw(16))和 ERROR_TEXT (CLOB).
- 如果SERVICE_CALL_ID 为空,那么我将插入一条新记录到
ERROR_LOGS 使用 ERROR_TEXT 和 CURRENT_TIMESTAMP.
- 如果SERVICE_CALL_ID不为空,那么我想在ERROR_LOGS中插入一条新记录,获取自动生成的ERROR_LOG_ID,并使用 SERVICE_CALL_ID 和获取的 ERROR_LOG_ID.
将新记录插入 SERVICE_CALL_ERROR_LOG_RELATION
获取 ERROR_LOG_ID 是我遇到问题的部分。我在这里找到了一些关于获取新插入记录的 ID(如果它是一个序列)的答案,但这些显然有点不同,因为序列具有 predictable 值......有没有办法获取自动生成的 ID在新记录上?
最后说明:当有一个 ERROR_LOG 插入时,往往会在几毫秒内插入多个,所以我不能依赖,比如说,获取最近的记录,因为到处理的时候可能有插入了其他记录。
好吧,我仍然需要在我的实际环境中将它们放在一起,但这个小测试程序对我有用。
INSERT INTO TABLE() RETURNING {COLUMN} INTO {VARIABLE}
示例如下:
CREATE OR REPLACE PROCEDURE LOG_SERVICE_ERROR(
SERVICE_CALL_ID IN RAW,
ERROR_TEXT IN CLOB
)
AS
v_ERROR_LOG_ID VARCHAR2(50 BYTE);
BEGIN
INSERT INTO ERROR_LOGS(SYS_GUID(), CURRENT_TIMESTAMP, ERROR_TEXT) RETURNING ERROR_LOG_ID INTO v_ERROR_LOG_ID;
IF SERVICE_CALL_ID IS NOT NULL THEN
INSERT INTO SERVICE_CALL_ERROR_LOG_RELATION(SYS_GUID(), CURRENT_TIMESTAMP, SERVICE_CALL_ID, v_ERROR_LOG_ID);
END IF;
END;
我的团队有两个 Oracle DB tables - 一个用于捕获服务调用请求和响应,另一个用于记录某些类型的错误。目前这两个 table 没有关联。他们都使用 DEFAULT SYS_GUID() 在插入时生成他们的 PK - 但其中一个将其存储为 raw(16),另一个存储为 varchar2(50 BYTE).
我正在创建一个 table,其中每个 table 都有一个 FK,并且通过一致投票,我需要使用 SYS_GUID() 作为 PK .
工作禁止在此处粘贴代码,因此粗略的示例代码如下,假设 typos/weird 格式不存在于 code/scripts 中:
table SERVICE_CALLS
SERVICE_CALL_ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
REQUEST_DATETIME DATE NOT NULL,
RESPONSE_DATETIME DATE,
REQUEST_PAYLOAD CLOB,
RESPONSE_PAYLOAD CLOB
table ERROR_LOGS
ERROR_LOG_ID VARCHAR2(50 BYTE) DEFAULT SYS_GUID() PRIMARY KEY,
ERROR_TIMESTAMP TIMESTAMP(6) NOT NULL,
ERROR_TEXT CLOB NOT NULL
我的新table:
table SERVICE_CALL_ERROR_LOG_RELATION
RELATION_ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
INSERT_TIMESTAMP TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
SERVICE_CALL_ID RAW(16) NOT NULL,
ERROR_LOG_ID CARCHAR2(50 BYTE) NOT NULL,
CONSTRAINT FK_SERVICE_CALL
FOREIGN KEY (SERVICE_CALL_ID),
REFERENCES SERVICE_CALLS(SERVICE_CALL_ID),
CONSTRAINT FK_ERROR_LOG
FOREIGN KEY (ERROR_LOG_ID)
REFERENCES ERROR_LOGS (ERROR_LOG_ID);
ERROR_LOG 将与 SERVICE_CALL 具有多对一关系,但并非每个 ERROR_LOG 都具有关联的 SERVICE_CALL。只有在 SERVICE_CALL_ID 可用时创建了 ERROR_LOG,关系 table 才会被填充;可用性将在实际应用中确定。如果没有 SERVICE_CALL_ID,我们将只在 ERROR_LOGS table 中插入一条记录,而不触及 RELATION table.
我对存储过程没有太多经验,但我的目标是创建一个存储过程,它将接收 SERVICE_CALL_ID(null 或 raw(16))和 ERROR_TEXT (CLOB).
- 如果SERVICE_CALL_ID 为空,那么我将插入一条新记录到 ERROR_LOGS 使用 ERROR_TEXT 和 CURRENT_TIMESTAMP.
- 如果SERVICE_CALL_ID不为空,那么我想在ERROR_LOGS中插入一条新记录,获取自动生成的ERROR_LOG_ID,并使用 SERVICE_CALL_ID 和获取的 ERROR_LOG_ID. 将新记录插入 SERVICE_CALL_ERROR_LOG_RELATION
获取 ERROR_LOG_ID 是我遇到问题的部分。我在这里找到了一些关于获取新插入记录的 ID(如果它是一个序列)的答案,但这些显然有点不同,因为序列具有 predictable 值......有没有办法获取自动生成的 ID在新记录上?
最后说明:当有一个 ERROR_LOG 插入时,往往会在几毫秒内插入多个,所以我不能依赖,比如说,获取最近的记录,因为到处理的时候可能有插入了其他记录。
好吧,我仍然需要在我的实际环境中将它们放在一起,但这个小测试程序对我有用。
INSERT INTO TABLE() RETURNING {COLUMN} INTO {VARIABLE}
示例如下:
CREATE OR REPLACE PROCEDURE LOG_SERVICE_ERROR(
SERVICE_CALL_ID IN RAW,
ERROR_TEXT IN CLOB
)
AS
v_ERROR_LOG_ID VARCHAR2(50 BYTE);
BEGIN
INSERT INTO ERROR_LOGS(SYS_GUID(), CURRENT_TIMESTAMP, ERROR_TEXT) RETURNING ERROR_LOG_ID INTO v_ERROR_LOG_ID;
IF SERVICE_CALL_ID IS NOT NULL THEN
INSERT INTO SERVICE_CALL_ERROR_LOG_RELATION(SYS_GUID(), CURRENT_TIMESTAMP, SERVICE_CALL_ID, v_ERROR_LOG_ID);
END IF;
END;