在plsql情况下使用CAST时,显示错误

时间:2018-04-19 09:05:41

标签: plsql

我想通过检查CLOB列的长度将单个clob数据列值放在2个varchar2列中,但我在case语句中得到错误,line在* *中标记,它表示syntex错误,我做错了什么

DECLARE
    v_tot_rows   NUMBER (3);
    rqst_xml_1   ISG.CERT_TEST_CASE_GTWY_TXN.RQST_XML_1_TX%TYPE;
    rqst_xml_2   ISG.CERT_TEST_CASE_GTWY_TXN.RQST_XML_2_TX%TYPE;

    CURSOR req_res_populate_cur
    IS
        SELECT scptc.SWR_CERT_PRJCT_TEST_CASE_ID,
               orb_txn.MIME_HEAD_TX,
               orb_txn.RSPNS_XML_TX,
               orb_msg.RQST_GNRL_VLD_JSON_TX,
               orb_msg.RQST_TEST_CASE_VLD_JSON_TX,
               orb_msg.MRCH_ID
               (
                   CASE
                        WHEN DBMS_LOB.GETLENGTH (orb_txn.RQST_XML_TX) <= 4000 THEN 
                            rqst_xml_1 := CAST ( orb_txn . RQST_XML_TX AS VARCHAR2 ( 4000 ) ) * ,
                            rqst_xml_2 := ''
                        WHEN DBMS_LOB.GETLENGTH(orb_txn.RQST_XML_TX)>4000 THEN
                            rqst_xml_1:=CAST(substr(orb_txn.RQST_XML_TX,1,4000) AS VARCHAR2(4000)),
                            rqst_xml_2:=CAST(substr(orb_txn.RQST_XML_TX,4001)
                  END
                )
          FROM ISG.online_messages     msg
               JOIN ISG.SWR_CERT_PRJCT_TEST_CASE scptc
                   ON msg.online_message_id = scptc.TXN_ID,
               ISG.GTWY_PLTFM_TXN_MSG  orb_msg
               JOIN ISG.GTWY_PLTFM_TXN orb_txn
                   ON orb_msg.GTWY_PLTFM_TXN_ID = orb_txn.GTWY_PLTFM_TXN_ID
         WHERE msg.SPEC_ID = 60;;
BEGIN
    FOR req_res IN req_res_populate_cur
    LOOP
        DBMS_OUTPUT.PUT_LINE (req_res.SWR_CERT_PRJCT_TEST_CASE_ID,
                              req_res.MIME_HEAD_TX,
                              req_res.rqst_xml_1,
                              req_res.rqst_xml_2,
                              req_res.RSPNS_XML_TX,
                              req_res.RQST_GNRL_VLD_JSON_TX,
                              req_res.RQST_TEST_CASE_VLD_JSON_TX,
                              req_res.MRCH_ID);
    END LOOP;
END;

1 个答案:

答案 0 :(得分:1)

您的问题是您的无效SELECT声明。您正在尝试在查询中设置变量(plsql-block)。这是没有意图或允许的。

您需要在列中选择值。这里我添加了两列。每个xml值一个。

SELECT scptc.SWR_CERT_PRJCT_TEST_CASE_ID,
       orb_txn.MIME_HEAD_TX,
       orb_txn.RSPNS_XML_TX,
       orb_msg.RQST_GNRL_VLD_JSON_TX,
       orb_msg.RQST_TEST_CASE_VLD_JSON_TX,
       orb_msg.MRCH_ID,
       CASE                                                        --Column-Start
           WHEN DBMS_LOB.GETLENGTH (orb_txn.RQST_XML_TX) <= 4000
           THEN
               CAST (orb_txn.RQST_XML_TX AS VARCHAR2 (4000))
           WHEN DBMS_LOB.GETLENGTH (orb_txn.RQST_XML_TX) > 4000
           THEN
               CAST (
                   SUBSTR (orb_txn.RQST_XML_TX, 1, 4000) AS VARCHAR2 (4000))
       END
           AS my_rqst_xml_1,                                       -- Column-End. In this column you'll have the value for xml_1 
       CASE                                                        --Column-Start
           WHEN DBMS_LOB.GETLENGTH (orb_txn.RQST_XML_TX) <= 4000
           THEN
               ''
           WHEN DBMS_LOB.GETLENGTH (orb_txn.RQST_XML_TX) > 4000
           THEN
               CAST (SUBSTR (orb_txn.RQST_XML_TX, 4001) AS VARCHAR2 (4000))
       END
           AS my_rqst_xml_2                                       -- Column-End. In this column you'll have the value for xml_12
  FROM ISG.online_messages     msg
       JOIN ISG.SWR_CERT_PRJCT_TEST_CASE scptc
           ON msg.online_message_id = scptc.TXN_ID,
       ISG.GTWY_PLTFM_TXN_MSG  orb_msg
       JOIN ISG.GTWY_PLTFM_TXN orb_txn
           ON orb_msg.GTWY_PLTFM_TXN_ID = orb_txn.GTWY_PLTFM_TXN_ID
 WHERE msg.SPEC_ID = 60

之后,您可以使用结果并从中获取值。

BEGIN
    FOR req_res IN req_res_populate_cur
    LOOP
        DBMS_OUTPUT.PUT_LINE (req_res.SWR_CERT_PRJCT_TEST_CASE_ID,
                              req_res.MIME_HEAD_TX,
                              req_res.my_rqst_xml_1, -- here we can see the values
                              req_res.my_rqst_xml_2, -- here too
                              req_res.RSPNS_XML_TX,
                              req_res.RQST_GNRL_VLD_JSON_TX,
                              req_res.RQST_TEST_CASE_VLD_JSON_TX,
                              req_res.MRCH_ID);

        -- And here we could store the values into variables or call some procedures etc.
        rqst_xml_1 := req_res.my_rqst_xml_1;
        rqst_xml_2 := req_res.my_rqst_xml_2;
    END LOOP;
END;

我猜测,但似乎你不想申报变量:

rqst_xml_1  ISG.CERT_TEST_CASE_GTWY_TXN.RQST_XML_1_TX%TYPE;
rqst_xml_2  ISG.CERT_TEST_CASE_GTWY_TXN.RQST_XML_2_TX%TYPE;

只有在您想使用这些值时才需要这样做。