2016-06-09 32 views
-1

這是我計劃運行的代碼。我想從數據庫中生成XML數據。所以我用XMLTYPE和REF CURSOR來生成數據。PLS-00103:遇到期望符號「文件結束」

CREATE OR REPLACE PROCEDURE XML_TEST AS 
BEGIN 
DECLARE 
    refcursor SYS_REFCURSOR; 
    wxmltype XMLTYPE; 
BEGIN 
dbms_output.put_line('Input the value of Mess_ID'); 
    OPEN refcursor FOR SELECT messid, studentname, messname 
          FROM studentsmessdata 
          WHERE messid in &messid; 
    wxmltype:= XMLTYPE(refcursor); 
    dbms_output.put_line(wxmltype.getClobVal); 
END; 
    NULL; 
END XML_TEST;` 
+0

該代碼是在SELECT messid,studentname此 DECLARE CURSOR currsor1,messname FROM studentsmessdata WHERE messid =&messid; –

+0

這是一個不完整的[PL/SQL塊](https://docs.oracle.com/cloud/latest/db112/LNPLS/block.htm) - 它沒有正文。這與替代變量無關。一旦你聲明它,你打算如何處理光標? (這也是'是'不是'IN')。 –

+0

我認爲你只有一個BEGIN太多(在DECLARE之前),並且在第一個END之後有一些尾隨的垃圾。 – eckes

回答

0

爲匿名塊

DECLARE 
    messid studentsmessdata.messid%TYPE; 
BEGIN 
    mymessid := foo; 

    FOR c IN (SELECT messid, studentname, messname 
       FROM studentsmessdata 
       WHERE messid = mymessid) 
    LOOP 
     DBMS_OUTPUT.putline (
      'messid: ' 
     || c.messid 
     || ' studentname ' 
     || c.stdentname 
     || ' messname ' 
     || c.messname); 
    END LOOP; 
END; 
+0

這並不是真的在聲明遊標(但它可能更好,取決於OP實際想要用它做什麼);並不基於用戶輸入。 –

0

你出什麼是一個不完整的PL/SQL block,因爲它有no body

有大量的文檔中塊的例子,including very high-level ones

<<label>> (optional) 
DECLARE -- Declarative part (optional) 
    -- Declarations of local types, variables, & subprograms 

BEGIN  -- Executable part (required) 
    -- Statements (which can use items declared in declarative part) 

[EXCEPTION -- Exception-handling part (optional) 
    -- Exception handlers for exceptions (errors) raised in executable part] 
END; 

請注意,你只使用可選的聲明部分,而不是所需的可執行部分。

聲明遊標時,您還使用了IN而不是IS

所以你沃爾德需要做的是這樣的:

DECLARE 
    CURSOR currsor1 IS 
    SELECT messid, 
     studentname, 
     messname 
    FROM studentsmessdata 
    WHERE messid = &messid; 
BEGIN 
    FOR rec IN currsor1 LOOP 
    -- do something with rec 
    END LOOP; 
END; 
/

你也可以打開遊標明確,並獲取到合適的記錄類型,可能在一個循環 - 儘管messid大概是唯一的,這樣你只反正在結果集中得到一行。或者你可以使用an implicit cursor rather than an explicit one;或者因爲它(可能)只有一行,你可以根本不用聲明遊標而是select into。您需要確定您打算如何處理查詢返回的數據。

+0

我編輯了代碼以顯示我最初想要做的事情。 –

相關問題