2015-08-02 3 views
1

Я использую базу данных оракула в asp.net и службах отчетов. Я создаю оракул хранимой процедуры, которая имеет XML-файл в качестве параметра, как в следующем:Передача данных xml в качестве параметра хранимой процедуры в ssrs

create or replace 
PROCEDURE SAL_REP_DETAILS_XML (

    P_CRITERIA_XML XMLTYPE , 
    P_EMPLOYEES OUT SYS_REFCURSOR, 
    P_ALLOWNCES OUT SYS_REFCURSOR, 
    P_DEDUCTIONS OUT SYS_REFCURSOR , 
    p_criteria OUT sys_refcursor) 
AS 
    V_SARF_AR_CONCACT VARCHAR2(500) ; 
    V_SARF_en_CONCACT VARCHAR2(500) ; 
    v_from_month  NUMBER ; 
    v_from_year  NUMBER ; 
    v_to_year   NUMBER ; 
    v_to_month  NUMBER ; 
BEGIN 
    FOR I IN 
    (SELECT xmltype.extract (value (TAB),'/CRITERIA/P_FROM_DATE/text()').GETSTRINGVAL() AS P_FROM_DATE , 
    XMLTYPE.EXTRACT (VALUE (TAB),'/CRITERIA/P_TO_DATE/text()').GETSTRINGVAL()   AS P_TO_DATE , 
    XMLTYPE.EXTRACT (VALUE (TAB),'/CRITERIA/P_EMPID/text()').GETSTRINGVAL()    AS P_EMPID , 
    XMLTYPE.EXTRACT (VALUE (TAB),'/CRITERIA/P_PAYROLL_TYPES_ARR/text()').GETSTRINGVAL() AS P_PAYROLL_TYPES_ARR , 
    XMLTYPE.EXTRACT (VALUE (TAB),'/CRITERIA/P_DEPT/text()').GETSTRINGVAL()    AS P_DEPT , 
    XMLTYPE.EXTRACT (VALUE (TAB),'/CRITERIA/P_REPORTFLAG/text()').GETSTRINGVAL()  AS P_REPORTFLAG 
    FROM TABLE (XMLSEQUENCE (P_CRITERIA_XML.extract ('/Root/CRITERIA'))) TAB 
) 
    LOOP 
    SELECT wm_concat(SARFNAME) , 
     wm_concat(SARFENNAME) 
    INTO V_SARF_AR_CONCACT , 
     V_SARF_en_CONCACT 
    FROM HRSARFIAT 
    WHERE SARFID IN 
     (SELECT * FROM TABLE (system_HELPER.string_tokenizer(i.P_PAYROLL_TYPES_ARR)) 
    ); 
    SELECT to_number (TO_CHAR(to_date(i.P_FROM_DATE, 'dd/mm/YYYY HH24:Mi:ss') , 'MM')) 
    INTO v_from_month 
    FROM dual ; 
    SELECT to_number (TO_CHAR(to_date(i.P_FROM_DATE, 'dd/mm/YYYY HH24:Mi:ss') , 'YYYY')) 
    INTO v_from_year 
    FROM dual ; 
    SELECT to_number (TO_CHAR(to_date(i.P_TO_DATE , 'dd/mm/YYYY HH24:Mi:ss') , 'YYYY')) 
    INTO v_to_year 
    FROM dual ; 
    SELECT to_number (TO_CHAR(to_date(i.P_TO_DATE , 'dd/mm/YYYY HH24:Mi:ss') , 'MM')) 
    INTO v_to_month 
    FROM dual ; 
    OPEN P_CRITERIA FOR SELECT system_HELPER.GET_APP_CODES_DESC(11,v_from_month ,1) 
    AS 
    MONTH_FROM_NAME_AR , 
    system_HELPER.GET_APP_CODES_DESC(11,v_from_month ,2) 
    AS 
    MONTH_FROM_NAME_EN , 
    system_HELPER.GET_APP_CODES_DESC(11,v_to_month ,1) 
    AS 
    MONTH_TO_NAME_AR , 
    system_HELPER.GET_APP_CODES_DESC(11,v_to_month ,2) 
    AS 
    MONTH_TO_NAME_EN , 
    v_from_year 
    AS 
    FROM_YEARCODE , 
    v_to_year 
    AS 
    to_YEARCODE , 
    i.P_FROM_DATE 
    AS 
    date_from , 
    i.P_to_DATE 
    AS 
    DATE_TO , 
    V_SARF_AR_CONCACT 
    AS 
    PAYROLL_TYPES_AR , 
    V_SARF_en_CONCACT 
    AS 
    PAYROLL_TYPES_en FROM dual ; 
    OPEN P_EMPLOYEES FOR SELECT result_data.* , 
    PRS_EMP.EMP_PIC FROM 
    (SELECT DISTINCT HR_EMP_SALARY.EMP_ID AS EMP_ID , 
     "PRS_EMP"."EMP_AR_DATA"    AS EMP_DATA_AR , 
     "PRS_EMP"."EMP_EN_DATA"    AS EMP_DATA_en , 
     "HREMPLOYMENTDATA"."JOBCODE" , 
     "PRS_JOBS"."JOBARNAME" AS JOBNAME_AR , 
     "PRS_JOBS"."JOBENNAME" AS JOBNAME_en , 
     HREMPLOYMENTDATA.CONTRACTSTDATE , 
     HREMPLOYMENTDATA.ATM_ACCOUNT , 
     PRS_EMP.EMP_GENDUR , 
     0       AS SAL_COMP_CODE_A , 
     ' '      AS COMP_DESC_A_AR , 
     ' '      AS COMP_DESC_A_en , 
     0       AS SAL_VALUE_A , 
     0       AS SAL_COMP_CODE_D , 
     ' '      AS COMP_DESC_D_AR , 
     ' '      AS COMP_DESC_D_en , 
     0       AS SAL_VALUE_D , 
     0       AS SAL_VALUE_NET , 
     GLCURRANCY.CURRARSYMBOL AS CURRSYMBOL_AR , 
     GLCURRANCY.CURRENSYMBOL AS CURRSYMBOL_en , 
     GLCURRANCY.FRACTIONENNAME AS FRACTIONNAME_EN , 
     GLCURRANCY.FRACTIONNAME AS FRACTIONNAME_ar 
    FROM HR_EMP_SALARY , 
     HR_SALARY_COMPONENT , 
     PRS_EMP , 
     HREMPLOYMENTDATA , 
     PRS_JOBS , 
     GLCURRANCY 
    WHERE HR_SALARY_COMPONENT.COMP_ID      = HR_EMP_SALARY.SAL_COMP_CODE 
    AND HR_EMP_SALARY.EMP_ID        = "HREMPLOYMENTDATA"."EMP_ID"(+) 
    AND "PRS_JOBS"."JOBCODE"(+)       = "HREMPLOYMENTDATA"."JOBCODE" 
    AND HR_EMP_SALARY.EMP_ID        = "HREMPLOYMENTDATA"."EMP_ID" 
    AND HR_EMP_SALARY.EMP_ID        = PRS_EMP.EMP_ID 
    AND GLLOCAL           = 1 
    AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') >= to_date(TO_CHAR(to_date(i.P_FROM_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') 
    AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') <= to_date(TO_CHAR(to_date(i.P_TO_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') 
    AND (HR_EMP_SALARY.EMP_ID       IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_EMPID)) 
    ) 
    OR i.P_EMPID    IS NULL) 
    AND (HR_EMP_SALARY.SARFID IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_PAYROLL_TYPES_ARR)) 
    ) 
    OR i.P_PAYROLL_TYPES_ARR IS NULL) 
    ORDER BY EMP_ID 
    ) result_data , 
    prs_emp WHERE prs_emp.EMP_ID = result_data.EMP_ID ; 
    OPEN P_ALLOWNCES FOR SELECT HR_EMP_SALARY.EMP_ID 
    AS 
    EMP_ID , 
    HR_SALARY_COMPONENT.COMP_ID 
    AS 
    SAL_COMP_CODE , 
    HR_SALARY_COMPONENT.COMP_ARDESC 
    AS 
    COMP_DESC_AR , 
    HR_SALARY_COMPONENT.COMP_ENDESC 
    AS 
    COMP_DESC_en , 
    HR_EMP_SALARY.SAL_VALUE 
    AS 
    SAL_VALUE , 
    HR_SALARY_COMPONENT.COMP_TYPE 
    AS 
    SAL_COMP_TYPE FROM HR_EMP_SALARY , 
    HR_SALARY_COMPONENT WHERE HR_SALARY_COMPONENT.COMP_ID = HR_EMP_SALARY.SAL_COMP_CODE AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') >= to_date(TO_CHAR(to_date(i.P_FROM_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') <= to_date(TO_CHAR(to_date(i.P_TO_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') AND HR_SALARY_COMPONENT.COMP_TYPE = 1 AND (HR_EMP_SALARY.EMP_ID IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_EMPID)) 
    ) OR i.P_EMPID IS NULL) AND (HR_EMP_SALARY.SARFID IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_PAYROLL_TYPES_ARR)) 
    ) OR i.P_PAYROLL_TYPES_ARR IS NULL) ORDER BY EMP_ID , 
    SAL_COMP_TYPE , 
    HR_SALARY_COMPONENT.ITEM_SORT , 
    HR_SALARY_COMPONENT.COMP_ID; 
    OPEN P_DEDUCTIONS FOR SELECT HR_EMP_SALARY.EMP_ID 
    AS 
    EMP_ID , 
    HR_EMP_SALARY.SAL_COMP_CODE 
    AS 
    SAL_COMP_CODE , 
    HR_SALARY_COMPONENT.COMP_ARDESC 
    AS 
    COMP_DESC_AR , 
    HR_SALARY_COMPONENT.COMP_ENDESC 
    AS 
    COMP_DESC_en , 
    HR_EMP_SALARY.SAL_VALUE 
    AS 
    SAL_VALUE , 
    HR_SALARY_COMPONENT.COMP_TYPE 
    AS 
    SAL_COMP_TYPE FROM HR_EMP_SALARY , 
    HR_SALARY_COMPONENT WHERE HR_SALARY_COMPONENT.COMP_ID = HR_EMP_SALARY.SAL_COMP_CODE AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') >= to_date(TO_CHAR(to_date(i.P_FROM_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') AND to_date(TO_CHAR(SAL_DATE ,'MM/YYYY'),'MM/YYYY') <= to_date(TO_CHAR(to_date(i.P_TO_DATE, 'dd/mm/YYYY HH24:Mi:ss'),'MM/YYYY'),'MM/YYYY') AND HR_SALARY_COMPONENT.COMP_TYPE = 2 AND (HR_EMP_SALARY.EMP_ID IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_EMPID)) 
    ) OR i.P_EMPID IS NULL) AND (HR_EMP_SALARY.SARFID IN 
     (SELECT * FROM TABLE (SYSTEM_HELPER.STRING_TOKENIZER(i.P_PAYROLL_TYPES_ARR)) 
    ) OR i.P_PAYROLL_TYPES_ARR IS NULL) ORDER BY EMP_ID , 
    SAL_COMP_TYPE , 
    HR_SALARY_COMPONENT.ITEM_SORT , 
    HR_SALARY_COMPONENT.COMP_ID; 
    END LOOP ; 

END SAL_REP_DETAILS_XML; 

при создании набора данных для формы отчета этой хранимой процедуры окно представляется мне под названием (определить параметры запроса)

при вводе данных XML в следующем виде:

<Root><CRITERIA><P_REPORTFLAG>1</P_REPORTFLAG><COMPUTER_NAME>dev-101</COMPUTER_NAME><P_PROCESS_ID>10859</P_PROCESS_ID><REPORT_DESIGNER>0</REPORT_DESIGNER><REPORT_FILTER>1</REPORT_FILTER><REPORT_PORTRAIT>0</REPORT_PORTRAIT><REPORT_SIZE>0</REPORT_SIZE><REPORT_RELOAD>0</REPORT_RELOAD><P_EMPID>1</P_EMPID><P_FROM_DATE>01/05/2015</P_FROM_DATE><P_TO_DATE>01/05/2015</P_TO_DATE><REPORT_LANGUAGE>1</REPORT_LANGUAGE><BRANCH_ID>1</BRANCH_ID><USER_ID>KHABEER</USER_ID></CRITERIA></Root> 

я ошибка это описание (ORA-06550: строка 1, столбец 7: PLS-00306: неверное число или типы аргументов в вызове к ' SAL_REP_DETAILS_XML ' ORA-06550: строка 1, столбец 7: PL/SQL: заявление игнорируется).

Может ли кто-нибудь помочь мне в этой проблеме?

ответ

0

Чтобы проверить такую ​​процедуру с помощью входных и выходных курсоров XMLType, я предпочитаю писать эксплицирующий блок PL/SQL - вот пример.

declare 
    v_EMPLOYEES SYS_REFCURSOR; 
    v_ALLOWNCES SYS_REFCURSOR; 
    v_DEDUCTIONS SYS_REFCURSOR; 
    v_criteria sys_refcursor; 
    -- your declaration for test 
    l_employee_id  number; 
    l_employee_name varchar2(100); 
BEGIN 
    SAL_REP_DETAILS_XML(
    xmltype('<Root/>'), /* your xml here */ 
    v_EMPLOYEES, 
    v_ALLOWNCES, 
    v_DEDUCTIONS, 
    v_criteria); 

    /* to read the output cursors use fetch in a loop */ 
    LOOP 
     FETCH v_EMPLOYEES INTO l_employee_id, l_employee_name ; 
     EXIT WHEN v_EMPLOYEES%NOTFOUND; 
     dbms_output.put_line(l_employee_id || l_employee_name); 
    END LOOP; 
END; 
/
+0

Я запустил процедуру с XML и возвратил данные. никаких проблем в процедуре моя проблема в создании набора данных в службах отчетности –

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