Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle में संग्रहीत कार्य वांछित तालिका में मान सम्मिलित नहीं करना

सबसे पहले आप किसी फ़ंक्शन को 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 , जब तक कि अनुक्रम से मान प्राप्त करने के अलावा और कुछ न हो।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL से कम या उसके बराबर

  2. वर्णों की जाँच करें स्ट्रिंग एक मान्य तिथि है या नहीं

  3. विभिन्न समय क्षेत्रों के बीच दिनांक/समय रूपांतरण

  4. क्या एक चेक बाधा किसी अन्य तालिका से संबंधित हो सकती है? आकाशवाणी

  5. Oracle में sql में ट्री संरचना। SQL Oracle में ट्री, चाइल्ड नोड्स और पैरेंट नोड्स कैसे दिखाएं?