2016-04-07 22 views
0
 varSQL: = 'DECLARE 


     varOptionId NUMBER; 
     varXML XMLTYPE; 
     varHsCode VARCHAR2(200); 
     varHsCodeCount NUMBER; 
     varId NUMBER; 
     RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 

     BEGIN 

     varXML:=:refXML; 


     varHsCode:= varXML.EXTRACT('/OBJECT/HsCodes/HsCode/text()').GETSTRINGVAL(); 


     :out:=varHsCode; 

     END'; 

     EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 

Yürütme Geçme:XML Bu aşağıdaki hatayı veriyor acil

ORA-06550: satır 9, sütun 15: PLS-00382: ifadesi yanlış tip ORA-06550 taşımaktadır: hat 9, sütun 2: PL/SQL: Bildirimi yok sayılır ORA-06512: "BIZZXE_V2_SCH.SYSTEM_UTILITY", satır 225 06550. 00000 - "satır% s, sütun% s: \ n% s" * Neden: Genellikle bir PL/SQL derleme hatası. * İşlem:

XML iletmek mümkün mü?

+1

Neden doğrudan çalıştırmıyorsunuz? – ibre5041

+0

Bunun için neden dinamik SQL kullanmak istediğinize dair bir fikriniz yok, ancak varSQL string değerinde unescape tek tırnak işareti var. Bağlamız yok, bu yüzden 'EXECUTE IMMEDIATE' paketinizin gövdesinin 225 satırı olduğunu doğrulayabilir ve bu, paketi derlerken gördüğünüz bir çalışma zamanı hatası değil midir? –

+0

Ve evet, sadece bir kodun bir sürümü ile denenmiş bazı hatalar düzeltilmiş bir XMLType iletebilirsiniz - eksik noktalı virgül, ilk satırda yanlış atama, kaçan tırnak. Gerçekte çalıştığınızı gösterdiğinizde, gördüğünüz hatayı yeniden oluşturmak için kullanabileceğimiz bir kod bloğu olarak faydalı olabilir. PXML aslında XMLType veya varchar2/CLOB mu? Bir dize ise bu hatayı alacaksınız, bu yüzden sorun budur. –

cevap

0

Evet, bir bağlama parametre olarak bir XMLType değişken geçirebilirsiniz: Bir dize olarak PXML ilan çünkü

declare 
    varsql varchar2(1024); 
    varout varchar2(4); 
    pxml xmltype := xmltype('<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>'); 
begin 
    varSQL := 'DECLARE 
varOptionId NUMBER; 
varXML XMLTYPE; 
varHsCode VARCHAR2(200); 
varHsCodeCount NUMBER; 
varId NUMBER; 
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 
BEGIN 
varXML:=:refXML; 

varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL(); 

:out:=varHsCode; 
END;'; 

    EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 
    dbms_output.put_line(varOut); 
end; 
/

PL/SQL procedure successfully completed. 

Test 

Eğer alıyorsanız hatadır; ya bir varchar2 veya CLOB değişken: En örnekte

declare 
    varsql varchar2(1024); 
    varout varchar2(4); 
</HsCodes></OBJECT>'); 
    pxml varchar2(64) := '<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>'; 
begin 
    varSQL := 'DECLARE 
varOptionId NUMBER; 
varXML XMLTYPE; 
varHsCode VARCHAR2(200); 
varHsCodeCount NUMBER; 
varId NUMBER; 
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 
BEGIN 
varXML:=:refXML; 

varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL(); 

:out:=varHsCode; 
END;'; 

    EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 
    dbms_output.put_line(varOut); 
end; 
/

Error report - 
ORA-06550: line 9, column 10: 
PLS-00382: expression is of wrong type 
ORA-06550: line 9, column 2: 
PL/SQL: Statement ignored 
ORA-06512: at line 21 

orada zaten dinamik SQL kullanmak için bir sebep değil, ama belki gerçek hayattaki örneği daha karmaşıktır.

İlgili konular