【问题标题】:How to return newly inserted record column value如何返回新插入的记录列值
【发布时间】:2014-10-19 09:54:09
【问题描述】:

我是 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 值。

如有任何疑问,请询问。在此致谢。

【问题讨论】:

标签: oracle plsql oracle10g oracle-sqldeveloper


【解决方案1】:

除了使用序列的.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;

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

    • p_IN_ID := SMS_IN_SEQ.CURRVAL;不工作需要 SELECT sms_in_seq.currval INTO p_in_id FROM dual;
    【解决方案3】:

    为了返回一些东西,你的过程需要声明一个 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% 确定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2013-06-11
      • 2015-08-14
      相关资源
      最近更新 更多