Search code examples
oraclesyntaxplsqlcompiler-errorsora-06550

Oracle stored procedure challenges


I'm doing my transition from T-SQL TO PL/SQL, in my first attempt I'm trying to create a stored procedure (PL/SQL) to load data into a table, but I'm getting an error:

PL/SQL: SQL Statement ignored  
ORA-06550: line 29, column 4:  
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the  following:

Code:

declare
  v_str VARCHAR2(32767) := '<ns0:ConnCustomerOrgServiceCreateRequest xmlns:ns0="http://tempuri.org" xmlns:ns6="http://schemas.microsoft.com/dynamics/2008/01/documents/ConnItemSvc" xmlns:ns4="http://schemas.microsoft.com/dynamics/2011/02/documents/DocumentPaging" xmlns:ns7="http://schemas.microsoft.com/dynamics/2011/02/documents/EntityKeyPage" xmlns:ns5="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey" xmlns:ns1="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes" xmlns:ns3="http://schemas.microsoft.com/dynamics/2006/02/documents/QueryCriteria" xmlns:ns8="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKeyList" xmlns:ns2="http://schemas.microsoft.com/dynamics/2008/01/documents/ConnCustomerOrg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns2:ConnCustomerOrg>
        <ns2:CustTable class="entity">
            <ns2:AccountNum xsi:nil="true" />
            <ns2:CreditMax>0</ns2:CreditMax>
            <ns2:CustGroup>10</ns2:CustGroup>
            <ns2:Organization class="entity">
                <ns2:NumberOfEmployees xsi:nil="true" />
                <ns2:OrganizationName class="entity">
                    <ns2:Name>PRUEBA</ns2:Name>
                </ns2:OrganizationName>
            </ns2:Organization>
        </ns2:CustTable>
    </ns2:ConnCustomerOrg>
</ns0:ConnCustomerOrgServiceCreateRequest>
';
  v_xml XMLTYPE := XMLTYPE(v_str);
begin

  select x.AccountNum, x.CreditMax
    from t
      ,XMLTABLE('/ConnCustomerOrgServiceCreateRequest/ConnCustomerOrg/CustTable'
              PASSING t.xml
              COLUMNS AccountNum  NUMBER PATH '/CustTable/AccountNum'
                     ,CreditMax   NUMBER PATH '/REC/CreditMax'                     
             ) x

end;

Solution

  • You must have an INTO clause when you are using a SELECT statement in a PL/SQL. INTO clause lets you store the values in a declared variable/s so you can access them inside the block whenever you want. Try this:

    declare
      v_str VARCHAR2(32767) := '<ns0:ConnCustomerOrgServiceCreateRequest xmlns:ns0="http://tempuri.org" xmlns:ns6="http://schemas.microsoft.com/dynamics/2008/01/documents/ConnItemSvc" xmlns:ns4="http://schemas.microsoft.com/dynamics/2011/02/documents/DocumentPaging" xmlns:ns7="http://schemas.microsoft.com/dynamics/2011/02/documents/EntityKeyPage" xmlns:ns5="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKey" xmlns:ns1="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes" xmlns:ns3="http://schemas.microsoft.com/dynamics/2006/02/documents/QueryCriteria" xmlns:ns8="http://schemas.microsoft.com/dynamics/2006/02/documents/EntityKeyList" xmlns:ns2="http://schemas.microsoft.com/dynamics/2008/01/documents/ConnCustomerOrg" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <ns2:ConnCustomerOrg>
            <ns2:CustTable class="entity">
                <ns2:AccountNum xsi:nil="true" />
                <ns2:CreditMax>0</ns2:CreditMax>
                <ns2:CustGroup>10</ns2:CustGroup>
                <ns2:Organization class="entity">
                    <ns2:NumberOfEmployees xsi:nil="true" />
                    <ns2:OrganizationName class="entity">
                        <ns2:Name>PRUEBA</ns2:Name>
                    </ns2:OrganizationName>
                </ns2:Organization>
            </ns2:CustTable>
        </ns2:ConnCustomerOrg>
    </ns0:ConnCustomerOrgServiceCreateRequest>
    ';
    
    
      v_xml XMLTYPE := XMLTYPE(v_str);
      v_accountnum VARCHAR2(2000);
      v_creditmax  VARCHAR2(2000);--i just assumed their datatypes since i cannot use %TYPE in here because i dont know what table accountnum and creditmax came from
    
    BEGIN
    
    SELECT x.AccountNum, x.CreditMax
    INTO v_accountnum, v_creditmax
    FROM t
        ,XMLTABLE('/ConnCustomerOrgServiceCreateRequest/ConnCustomerOrg/CustTable'
                  PASSING t.xml
                  COLUMNS AccountNum  NUMBER PATH '/CustTable/AccountNum'
                         ,CreditMax   NUMBER PATH '/REC/CreditMax'
    
                 ) x;
    
    END;
    

    Hope this helps.