为啥在将 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 FORRETURN rc; ? @don_julian 是的,你可以。 db<>fiddle

以上是关于为啥在将 INSERT 方法传输到 Function 时收到错误消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥在将使用 Diesel 特征的函数重写为特征方法时会出现“溢出评估需求”?

为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?

为啥在将 ArrayList 值加载到其中后 HashMap 不打印?

为啥我在将 MERN 部署到 Heroku 期间错误地收到文件丢失错误?

为啥在将项目附加到现有列表时会得到“无”项目? [复制]

为啥在将应用程序部署到 Heroku 时出现此错误?