Reputation: 6770
I am new to Oracle SQL Developer. I am trying to write a SP to insert value,After insert record sp return correspondent talbe’s column= IN_ID(it’s primary key) value.My SP using the following query
Table:
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;
After insert help me to return newly inserted record column= IN_ID value.
If have any query please ask.Thanks in advanced.
Upvotes: 4
Views: 17493
Reputation: 5288
Aside using sequence's .currval
you can also use RETURNING
clause part of insert statement.
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;
Upvotes: 7
Reputation: 3816
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;
Upvotes: 2
Reputation: 231661
In order to return something, your procedure would need to declare an OUT parameter. Given that you're explicitly referencing a sequence in your INSERT
, you can use the currval
of the sequence to return the inserted value. Something like
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;
As an aside, a commit
in a simple stored procedure like this strikes me as highly dubious. That means that you can never use this procedure inside a larger transaction. It seems highly unlikely that you would never want to compose a transaction that includes writing to this table.
You've tagged this as 10g which is why I'm doing the SELECT ... INTO
to populate p_in_id
rather than just doing a direct assignment. I believe that support for just saying p_in_id := sms_in_seq.currval
was added in 11.1 but I'm not 100% certain about that.
Upvotes: 1