我們正在使用專有產品來開發我們的應用程式。該產品能夠連接到Oracle DB并執行SQL查詢和存盤程序。但是,今天我們發現一個奇怪的問題,如果存盤程序中有時間戳輸入引數,該產品無法執行存盤程序。
PFB SQL 查詢表和存盤程序。我們現在正嘗試將“p_timestamp”輸入引數從時間戳更改為 varchar2。因此,應用程式會將時間戳值作為字串發送,然后在存盤程序中執行插入陳述句之前/期間,我們希望將此 varchar2 值轉換為時間戳。此外,此時間戳應存盤在 UTC 時區中。
您能幫忙將“p_timestamp”varchar2 輸入引數轉換為時間戳嗎?
桌子:
CREATE TABLE MYAPPROVALS_AUDIT (
ID NUMBER GENERATED ALWAYS AS IDENTITY,
MESSAGE_TYPE VARCHAR2(64 CHAR),
COMPONENT_NAME VARCHAR2(64 CHAR),
USERNAME VARCHAR2(32 CHAR),
TIMESTAMP TIMESTAMP WITH TIME ZONE NOT NULL,
REQUEST_NUMBER VARCHAR2(64 CHAR),
MODULE_NAME VARCHAR2(256 CHAR),
PROCESS_NAME VARCHAR2(256 CHAR),
VERSION VARCHAR2(64 CHAR),
TASK VARCHAR2(64 CHAR),
ERROR_CODE VARCHAR2(256 CHAR),
ERROR_MESSAGE VARCHAR2(4000 CHAR),
MESSAGE VARCHAR2(4000 CHAR)
);
存盤程序:
CREATE OR REPLACE PROCEDURE MYAPPROVALS_AUDIT_INSERT_RECORD(
p_message_Type IN myapprovals_audit.message_type%TYPE,
p_component_Name IN myapprovals_audit.component_name%TYPE,
p_username IN myapprovals_audit.USERNAME%TYPE,
p_timestamp IN varchar2,
p_request_Number IN myapprovals_audit.request_number%TYPE,
p_module_Name IN myapprovals_audit.module_name%TYPE,
p_process_Name IN myapprovals_audit.process_name%TYPE,
p_version IN myapprovals_audit.version%TYPE,
p_task IN myapprovals_audit.task%TYPE,
p_error_Code IN myapprovals_audit.error_code%TYPE,
p_error_Message IN myapprovals_audit.error_message%TYPE,
p_message IN myapprovals_audit.message%TYPE
)
IS
BEGIN
INSERT INTO MYAPPROVALS_AUDIT ("MESSAGE_TYPE", "COMPONENT_NAME", "USERNAME", "TIMESTAMP", "REQUEST_NUMBER", "MODULE_NAME", "PROCESS_NAME", "VERSION", "TASK", "ERROR_CODE", "ERROR_MESSAGE", "MESSAGE")
VALUES (p_message_Type, p_component_Name, p_username, TO_TIMESTAMP(trunc(p_timestamp)) at time zone 'UTC', p_request_Number, p_module_Name, p_process_name, p_version, p_task, p_error_Code, p_error_Message, p_message);
COMMIT;
END;
/
uj5u.com熱心網友回復:
假設您的輸入是帶有小數秒和時區的 ISO8601 格式,那么:
CREATE OR REPLACE PROCEDURE MYAPPROVALS_AUDIT_INSERT_RECORD(
p_message_Type IN myapprovals_audit.message_type%TYPE,
p_component_Name IN myapprovals_audit.component_name%TYPE,
p_username IN myapprovals_audit.USERNAME%TYPE,
p_timestamp IN varchar2,
p_request_Number IN myapprovals_audit.request_number%TYPE,
p_module_Name IN myapprovals_audit.module_name%TYPE,
p_process_Name IN myapprovals_audit.process_name%TYPE,
p_version IN myapprovals_audit.version%TYPE,
p_task IN myapprovals_audit.task%TYPE,
p_error_Code IN myapprovals_audit.error_code%TYPE,
p_error_Message IN myapprovals_audit.error_message%TYPE,
p_message IN myapprovals_audit.message%TYPE
)
IS
BEGIN
INSERT INTO MYAPPROVALS_AUDIT (
MESSAGE_TYPE, -- You do not need to quote identifiers.
COMPONENT_NAME,
USERNAME,
TIMESTAMP,
REQUEST_NUMBER,
MODULE_NAME,
PROCESS_NAME,
VERSION,
TASK,
ERROR_CODE,
ERROR_MESSAGE,
MESSAGE
) VALUES (
p_message_Type,
p_component_Name,
p_username,
TO_TIMESTAMP_TZ( -- Assuming TIMESTAMP WITH TIME ZONE
p_timestamp,
'YYYY-MM-DD"T"HH24:MI:SS.FF TZH:TZM' -- Your timestamp format model
) at time zone 'UTC',
p_request_Number,
p_module_Name,
p_process_name,
p_version,
p_task,
p_error_Code,
p_error_Message,
p_message
);
-- Do not COMMIT in the procedure.
-- COMMIT when you finalise the transaction that way you can chain multiple
-- procedures together and if one fails ROLLBACK the entire transaction.
END;
/
如果它采用不同的格式,則更改格式模型以適合您的資料。
uj5u.com熱心網友回復:
輸入將類似于“2022-04-01T17:32:22.223Z”
如果您使用的是最新版本的 Oracle,則可以使用TO_UTC_TIMESTAMP_TZ,即代替
TO_TIMESTAMP(trunc(p_timestamp)) at time zone 'UTC'
你可以做
TO_UTC_TIMESTAMP_TZ(p_timestamp)
這將為您提供帶有時區的時間戳,如 UTC;如果您想要一個簡單的時間戳,您可以在插入期間隱式或顯式地轉換它:
CAST(TO_UTC_TIMESTAMP_TZ(p_timestamp) AS TIMESTAMP)
如果傳遞的字串始終是該格式并且始終是 UTC,帶有 Z 指示符,并且您希望以純時間戳結束,您還可以執行以下操作:
TO_TIMESTAMP(p_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF"Z"')
快速db<>fiddle顯示所有三個,以及您的示例字串值。
最好還是調查一下產品為什么會出現時間戳問題,這樣您就可以讓它傳遞正確的資料型別并避免轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454858.html
