सबसे पहले आप किसी फ़ंक्शन को DML के साथ कॉल नहीं कर सकते इसमें एक चुनिंदा बयान में। आपको PL/SQL ब्लॉक में एक वैरिएबल को आउटपुट असाइन करना होगा, कुछ इस तरह:
declare
l_output number;
begin
l_output := my_function(variable1, variable2);
end;
एक समारोह में डीएमएल करना बुरा व्यवहार है; आंशिक रूप से क्योंकि यह आपके सामने आने वाली त्रुटियों का कारण बनता है। आपको नीचे दिए गए विवरण के अनुसार एक प्रक्रिया का उपयोग करना चाहिए। इसका दूसरा कारण यह है कि आप हमेशा की तरह शून्य लौट रहे हैं, कुछ भी वापस करने की कोई आवश्यकता नहीं है!
create or replace procedure my_procedure ( <variables> ) is
begin
insert into employees( <columns> )
values ( <values > );
end;
आपकी त्रुटि का विशिष्ट कारण यह पंक्ति है:tBirthdate := to_date('pBirthdate','dd/mm/yyyy');
pBirthdate
पहले से ही एक स्ट्रिंग है; '
. डालकर इसके चारों ओर आप स्ट्रिंग पास कर रहे हैं 'pBirthdate'
फ़ंक्शन के लिए to_date
और Oracle इस स्ट्रिंग को एक दिन, महीने या वर्ष में नहीं बदल सकता, इसलिए यह विफल हो रहा है।
आपको इसे इस प्रकार लिखना चाहिए:tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');
आपको number(38,0)
. निर्दिष्ट करने की भी आवश्यकता नहीं है , आप बस number
write लिख सकते हैं इसके बजाय।
out
. का उपयोग करके किसी प्रक्रिया से मान वापस करना संभव है खोजशब्द। अगर हम मानते हैं कि आप empid
return वापस करना चाहते हैं आप कुछ इस तरह लिख सकते हैं:
create or replace procedure A1SF_ADDEMP (
pEmpName in varchar2
, pTaxFileNo in varchar2
, pGender in varchar2
, pSalary in number
, pBirthdate in varchar2
, pEmpid out number
) return varchar2 is
begin
pempid := A1Seq_Emp.nextval;
Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
Values ( pEmpId, pEmpName, pTaxFileNo, pGender
, pSalary, to_date(pBirthdate,'dd/mm/yyyy');
end;
प्रक्रिया को निष्पादित करने के लिए इसे इस तरह कॉल करें:
begin
A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
अगर आप empid
वापस करना चाहते हैं तो आप इसे इस तरह कह सकते हैं:
declare
l_empid number;
begin
l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
, Salary, Birthdate);
commit;
end;
ध्यान दें कि मैंने commit
को कैसे स्थानांतरित किया है उच्चतम स्तर तक, यह हर प्रक्रिया में सामान करने से बचने के लिए है जब आपके पास और चीजें हो सकती हैं जो आपको करने की आवश्यकता होती है।
संयोग से, यदि आप Oracle 11g का उपयोग कर रहे हैं तो A1Seq_Emp.nextval
मान निर्दिष्ट करने की कोई आवश्यकता नहीं है एक चर के लिए। आप इसे सीधे values
. में तालिका में सम्मिलित कर सकते हैं सूची। बेशक आप इसे वापस नहीं कर पाएंगे, लेकिन आप A1Seq_Emp.curval
, जब तक कि अनुक्रम से मान प्राप्त करने के अलावा और कुछ न हो।