首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle插入使用select添加第一行和返回列而不使用pl/sql存储过程

Oracle插入使用select添加第一行和返回列而不使用pl/sql存储过程
EN

Stack Overflow用户
提问于 2017-03-16 17:10:44
回答 1查看 1.5K关注 0票数 0

我需要使用select语句插入单行并返回插入到表中的值。应用程序需要保存插入值的值,以便在应用程序中进一步使用。我需要使用insert with返回选项,因为select使用最大值,因此select总是返回单列,另外,我可以添加条件从select语句返回单行。我需要避免使用plsql,并且必须在一个语句中完成。

代码语言:javascript
运行
复制
    INSERT INTO TEMPTABLE (COLID)
      SELECT max( COLID ) +1  FROM APPLICATIONTABLE
      WHERE  ROWNUM <=1 RETURNING colid;

我得到了错误的SQL : ORA-00933: SQL命令没有正确结束,我不希望使用使用变量的声明语句。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 18:16:02

您的代码有两个问题:

  1. 必须将值返回到某个变量或参数中。
  2. 不能将returning与基于select语句的insert语句一起使用。

这样做是可行的:

代码语言:javascript
运行
复制
DECLARE
 v1 APPLICATIONTABLE.colid%type;
 v2 TEMPTABLE.columnid%type;
BEGIN
 SELECT max( COLID ) +1  
   INTO v1
   FROM APPLICATIONTABLE;
 INSERT INTO TEMPTABLE (COLID) VALUES (v1)
      RETURNING columnid INTO v2;
END;

或者,如果(我猜)您的意思是columnidcolid,那么:

代码语言:javascript
运行
复制
DECLARE
 v1 APPLICATIONTABLE.colid%type;
BEGIN
 SELECT max( COLID ) +1  
   INTO v1
   FROM APPLICATIONTABLE;
 INSERT INTO TEMPTABLE (COLID) VALUES (v1);
END;

顺便说一句,max( COLID ) + 1向我提出了一个警告标志:通常最好使用序列而不是这种方法来生成新的键:

代码语言:javascript
运行
复制
DECLARE
 v1 APPLICATIONTABLE.colid%type;
BEGIN
 INSERT INTO TEMPTABLE (COLID) VALUES (colidseq.nextval) 
    RETURNING colid INTO v1;
END;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42840590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档