आप इसे आजमा सकते हैं। तुम एक पैकेज की घोषणा करने के लिए अपने आईडी पर कब्जा करने की आवश्यकता होगी, अन्यथा यह SQL विवरण को दिखाई नहीं होगा और आप एक त्रुटि प्राप्त होगी:
कृपया-00231: समारोहनामएसक्यूएल में इस्तेमाल नहीं किया जा सकता है
तो, पहले कार्यों के साथ पैकेज पर कब्जा करने की बना सकते हैं और फिर बाद में मर्ज बयान से आईडी का उपयोग:
CREATE OR REPLACE PACKAGE CaptureId
AS
FUNCTION SaveId(newId IN NUMBER) RETURN NUMBER;
FUNCTION GetId RETURN NUMBER;
END;
CREATE OR REPLACE PACKAGE BODY CaptureId
AS
capturedId NUMBER(10);
FUNCTION SaveId(newId IN NUMBER) RETURN NUMBER IS
BEGIN
capturedId := newId;
RETURN capturedId;
END;
FUNCTION GetId RETURN NUMBER IS
BEGIN
RETURN capturedId;
END;
END;
एक सरल मेज और अनुक्रम जनरेटर को देखते हुए के रूप में परिभाषित:
CREATE TABLE EMPLOYEE
(
EMPLOYEE_ID NUMBER(10) NOT NULL,
FIRST_NAME VARCHAR2(120) NOT NULL,
LAST_NAME VARCHAR2(120) NOT NULL,
CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_ID) ENABLE
);
CREATE SEQUENCE SEQ_EMPLOYEE;
फिर आप आईडी को कैप्चर करने और इसे वापस करने के लिए अपने मर्ज स्टेटमेंट के साथ एक अज्ञात ब्लॉक में पैकेज का उपयोग कर सकते हैं। ध्यान दें कि यह एक बहुत ही सरल उदाहरण है और यह सरणी-बाध्य चर के साथ काम नहीं करेगा जब तक आप किसी तालिका प्रकार में आईडी को कैप्चर करने के लिए पैकेज को पुन: कार्य नहीं करते। अगर मुझे मौका मिलता है, तो मैं एक उदाहरण पेश करने की कोशिश कर सकता हूं जो इसे दिखाता है।
BEGIN
MERGE INTO EMPLOYEE USING (SELECT CaptureId.SaveId(:myInputId) AS EMPLOYEE_ID,
:myFirstName as FIRST_NAME,
:myLastName as LAST_NAME
FROM DUAL) B
ON (A.EMPLOYEE_ID = B.EMPLOYEE_ID)
WHEN NOT MATCHED THEN
INSERT (EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME)
VALUES (CaptureId.SaveId(SEQ_EMPLOYEE.NEXTVAL),
B.FIRST_NAME,
B.LAST_NAME)
WHEN MATCHED THEN
UPDATE SET A.FIRST_NAME= B.FIRST_NAME,
A.LAST_NAME= B.LAST_NAME;
SELECT CaptureId.GetId INTO :myOutputId FROM DUAL;
END;
स्रोत
2017-06-12 21:59:35
यह "एक त्रुटि देता है" क्योंकि [वहाँ में लौटने का उपयोग करने की कोई सुविधा है] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#SQLRF01606) । हालांकि, अगर आप पीके _by परिभाषा को वापस करना चाहते हैं तो आपको इसे किसी चीज़ में वापस करना होगा, जिसका अर्थ है कि आप कुछ विवरण के रैपर का उपयोग कर रहे हैं। इस रैपर के साथ पीएल/एसक्यूएल ब्लॉक होने में क्या गलत है।यदि आप यह नहीं चाहते हैं कि यह एक प्रक्रिया/कार्य हो, तो आपको यह निर्दिष्ट करना होगा कि आप क्या उपयोग करना चाहते हैं अन्यथा इस सवाल का जवाब देना असंभव है। – Ben
मैं ऐसा करने के लिए एक एकल ऑरैकल क्वेरी का उपयोग कर रहा हूं। : empId मैं आउटपुट पैरामीटर के रूप में इस क्वेरी को पास कर रहा हूं। क्या एक एकल विलय क्वेरी से आउटपुट पैरामीटर मान प्राप्त करना संभव है? –
आपको इसे पढ़ने में रुचि हो सकती है - http://www.oracle-developer.net/display.php?id=413 –