如何返回新插入的记录列值

时间:2014-08-26 06:44:42

标签: oracle plsql oracle10g oracle-sqldeveloper

我是 Oracle SQL Developer的新手。我正在尝试编写一个SP来插入值,插入记录后sp返回通讯员talbe的列= IN_ID (它的主键)值。我 SP 使用以下查询

表格

CREATE TABLE SMS_IN
(
  IN_ID      NUMBER(20)                         NOT NULL,
  MOBILE_NO  VARCHAR2(20 BYTE)                  NOT NULL,
  SMS_BODY   VARCHAR2(200 BYTE)                 NOT NULL,
  STATUS     NUMBER(1)                          NOT NULL,
  USERS      VARCHAR2(20 BYTE)                  NOT NULL,
  REMARKS    VARCHAR2(200 BYTE),
  IN_TIME    DATE                               NOT NULL
)

SP:

CREATE OR REPLACE PROCEDURE TST_SMS_IN
(
--P_MSISDN NUMBER,
P_MOBILE_NO varchar2, 
P_SMS_BODY VARCHAR2
)
IS

V_SYSTEM_DATE DATE;
V_YEAR NUMBER;
V_YEAR_SYSTEM NUMBER;
V_TABLE_NAME VARCHAR2(100) :='';
V_SQL VARCHAR2(1000) :='';
V_ERROR_MESSAGE VARCHAR2(1000) :='';

P_AVG NUMBER;
V_CREATED_BY NUMBER;

BEGIN
     INSERT INTO SMS_IN(IN_ID,MOBILE_NO,SMS_BODY,STATUS,USERS,REMARKS,IN_TIME) VALUES
     (SMS_IN_SEQ.NEXTVAL,P_MOBILE_NO,P_SMS_BODY,0,'gp','TEST',sysdate);
     COMMIT;

END TST_SMS_IN;

插入后帮我返回新插入的记录列= IN_ID值。

如果有任何疑问,请询问。谢谢你。

3 个答案:

答案 0 :(得分:2)

除了使用序列.currval之外,您还可以使用插入语句的RETURNING子句部分。

INSERT INTO SMS_IN(IN_ID,MOBILE_NO,SMS_BODY,STATUS,USERS,REMARKS,IN_TIME) 
VALUES (SMS_IN_SEQ.NEXTVAL,P_MOBILE_NO,P_SMS_BODY,0,'gp','TEST',sysdate)
RETURNING IN_ID INTO p_in_id;

答案 1 :(得分:1)

为了返回某些内容,您的过程需要声明一个OUT参数。鉴于您明确引用了INSERT中的序列,您可以使用序列的currval来返回插入的值。像

这样的东西
CREATE OR REPLACE PROCEDURE TST_SMS_IN
(
  P_MOBILE_NO IN varchar2, -- Adding IN just for clarity
  P_SMS_BODY  IN VARCHAR2,
  p_IN_ID    OUT NUMBER    -- Adding the OUT parameter
)
IS
  <<snip>>
BEGIN
     INSERT INTO SMS_IN(IN_ID,MOBILE_NO,SMS_BODY,STATUS,USERS,REMARKS,IN_TIME) 
       VALUES (SMS_IN_SEQ.NEXTVAL,P_MOBILE_NO,P_SMS_BODY,0,'gp','TEST',sysdate);

     SELECT sms_in_seq.currval
       INTO p_in_id
       FROM dual;

     COMMIT;
END TST_SMS_IN;

顺便说一下,像这样的简单存储过程中的commit让我觉得非常可疑。这意味着您永远不能在更大的事务中使用此过程。您似乎不太可能永远不想撰写包含写入此表的交易。

您已将此标记为10g,这就是为什么我要SELECT ... INTO填充p_in_id而不是直接分配。我相信在11.1中添加了对p_in_id := sms_in_seq.currval的支持,但我并不是100%肯定。

答案 2 :(得分:1)

CREATE OR REPLACE PROCEDURE TST_SMS_IN
(
--P_MSISDN NUMBER,
P_MOBILE_NO varchar2, 
P_SMS_BODY VARCHAR2,
p_IN_ID    INTEGER
)
IS

V_SYSTEM_DATE DATE;
V_YEAR NUMBER;
V_YEAR_SYSTEM NUMBER;
V_TABLE_NAME VARCHAR2(100) :='';
V_SQL VARCHAR2(1000) :='';
V_ERROR_MESSAGE VARCHAR2(1000) :='';

P_AVG NUMBER;
V_CREATED_BY NUMBER;

BEGIN
     INSERT INTO SMS_IN(IN_ID,MOBILE_NO,SMS_BODY,STATUS,USERS,REMARKS,IN_TIME) VALUES
     (SMS_IN_SEQ.NEXTVAL,P_MOBILE_NO,P_SMS_BODY,0,'gp','TEST',sysdate);

     p_IN_ID := SMS_IN_SEQ.CURRVAL;

     COMMIT;

END TST_SMS_IN;