这是我计划运行的代码。我想从数据库生成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;`
答案 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
而不是声明一个光标。您需要确定计划对查询返回的数据执行的操作。