PLS-00103:遇到符号"文件结束"什么时候期待

时间:2016-06-09 15:59:58

标签: sql oracle

这是我计划运行的代码。我想从数据库生成XML数据。所以我使用XMLTYPE和REF CURSOR来生成数据。

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;`

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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而不是声明一个光标。您需要确定计划对查询返回的数据执行的操作。