为啥在将 INSERT 方法传输到 Function 时收到错误消息
Posted
技术标签:
【中文标题】为啥在将 INSERT 方法传输到 Function 时收到错误消息【英文标题】:Why I get error message when transfer INSERT method to Function为什么在将 INSERT 方法传输到 Function 时收到错误消息 【发布时间】:2020-10-29 12:37:59 【问题描述】:我收到错误消息,这让我有点困惑,不知道我在这里做错了什么
FUNCTION ADD_TOKEN(p_userID IN INT,p_token IN VARCHAR2,p_type IN VARCHAR2 )
RETURN SYS_REFCURSOR IS
rc SYS_REFCURSOR;
/*TokenExists*/
BEGIN
INSERT INTO user_notifications_token (userId, token, type)
VALUES (p_userID, p_token , p_type) ON DUPLICATE KEY
UPDATE token = p_token, created_date = SYSTIMESTAMP;
END ADD_TOKEN;
我收到错误消息
Error(51,3): PL/SQL: SQL Statement ignored
我把这个函数放在PACKAGE
里面我存储了我所有的函数(arround 50 functions)
有谁知道这里有什么问题?我哪里做错了?
【问题讨论】:
【参考方案1】:甲骨文does not support the SQL Server syntax INSERT ... ON DUPLICATE KEY UPDATE ...
。请改用MERGE
语句。
FUNCTION ADD_TOKEN(
p_userID IN user_notifications_token.userID%TYPE,
p_token IN user_notifications_token.token%TYPE,
p_type IN user_notifications_token.type%TYPE
) RETURN SYS_REFCURSOR
IS
rc SYS_REFCURSOR;
BEGIN
MERGE INTO user_notifications_token dst
USING (
SELECT p_userID AS userID,
p_token AS token,
p_type AS type
FROM DUAL
) src
ON ( src.userId = dst.userID )
WHEN MATCHED THEN
UPDATE SET token = src.token, type = src.type
WHEN NOT MATCHED THEN
INSERT ( userId, token, type ) VALUES ( src.userId, src.token, src.type );
-- Do stuff
RETURN rc;
END ADD_TOKEN;
如果你这样做:
DECLARE
rc SYS_REFCURSOR;
BEGIN
rc := package_name.ADD_TOKEN( 1, 'ABC', 'A' );
rc := package_name.ADD_TOKEN( 1, 'DEF', 'D' );
END;
/
表格将包含:
用户名 |代币 |类型 -----: | :---- | :--- 1 |防御工事 | D
db小提琴here
【讨论】:
能否提供一些完整答案的例子,我将非常感谢 我可以在这里使用 currson 吗?OPEN rc FOR
和 RETURN rc;
?
@don_julian 是的,你可以。 db<>fiddle以上是关于为啥在将 INSERT 方法传输到 Function 时收到错误消息的主要内容,如果未能解决你的问题,请参考以下文章
为啥在将使用 Diesel 特征的函数重写为特征方法时会出现“溢出评估需求”?
为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?
为啥在将 ArrayList 值加载到其中后 HashMap 不打印?