2015-10-29 3 views
0

Я делаю мой переход от T-SQL TO PL/SQL, в моей первой попытке я пытаюсь создать хранимую процедуру (PL/SQL) для загрузки данных в таблицу, но я получаю сообщение об ошибке:Oracle хранимой процедуры проблемы

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: 

Код:

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; 
+2

Чистый выбор внутри pl/sql должен SELECT <список полей> INTO <соответствующий список переменных> WHERE ...; Вы выбираете, но не помещаете значения в любом месте. И если ваше утверждение может возвращать более одной строки, вам нужно либо сделать это в конструкции цикла, либо массировать сбор в коллекцию. –

+0

У вас нет вставки. На данный момент вам действительно не нужен PL/SQL, но поскольку вы используете его, вам нужно выбрать * в * что-то - вам нужны переменные PL/SQL для соответствия столбцам набора результатов из запроса, то есть два числа переменные. (Плюс недостающая точка с запятой, конечно). А какая таблица 't' вы выбираете? Вы скопировали это из примера CTE? –

+0

@AlexPoole & Michael Broughton !!!! НАЧАТЬ С т а (выберите XmlType (v_str) в виде XML из двойного) выберите x.AccountNum, x.CreditMax из т , XMLTABLE ('/ ConnCustomerOrgServiceCreateRequest/ConnCustomerOrg/CustTable' ПРОХОЖДЕНИЕ t.xml КОЛОННЫ AccountNum НОМЕР PATH '/ CustTable/AccountNum' , CreditMax NUMBER PATH '/ CustTable/CreditMax' ) x; конец; – AFF

ответ

2

У вас должно быть предложение INTO, когда вы используете инструкцию SELECT в PL/SQL. Предложение INTO позволяет хранить значения в объявленной переменной/s, чтобы вы могли обращаться к ним внутри блока, когда захотите. Попробуйте следующее:

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; 

Надеюсь, что это поможет.

1

У вас не хватает запятой ; после оператора выбора. Каждый оператор должен быть завершен с помощью ;.

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; 
+0

Спасибо! ..... У меня все еще проблема, но это было частью моей проблемы :) – AFF

Смежные вопросы