2016-06-09 61 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

我编辑了代码以显示我最初想要做的事情。 –

相关问题