求救DBMS_SQL怎么样返回记录集或者游标

[复制链接]
查看11 | 回复2 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
我想用dbms_sql调用存储过程,由于存储过程的输出参数需要是对象集或者是游标,请问这种情况需要怎么样定义该输出列?谢谢!
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
是不是转换一下比较好
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
Examples:
The following procedure displays employees by defining a cursor with two columns and, after fetching a row, calls COLUMN_VALUE to retrieve both column values:
CREATE OR REPLACE PROCEDURE showemps (where_in IN VARCHAR2 := NULL)
IS
cur INTEGER := DBMS_SQL.OPEN_CURSOR;
rec emp%ROWTYPE;
fdbk INTEGER;
BEGIN
DBMS_SQL.PARSE
(cur, 'SELECT empno, ename FROM emp ' ||
' WHERE ' || NVL (where_in, '1=1'),
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN (cur, 1, rec.empno);
DBMS_SQL.DEFINE_COLUMN (cur, 2, rec.ename, 30);
fdbk := DBMS_SQL.EXECUTE (cur);
LOOP
/* Fetch next row. Exit when done. */
EXIT WHEN DBMS_SQL.FETCH_ROWS (cur) = 0;
DBMS_SQL.COLUMN_VALUE (cur, 1, rec.empno);
DBMS_SQL.COLUMN_VALUE (cur, 2, rec.ename);
DBMS_OUTPUT.PUT_LINE (TO_CHAR (rec.empno) || '=' || rec.ename);
END LOOP;
DBMS_SQL.CLOSE_CURSOR (cur);
END;
/
This next PL/SQL8 block fetches the hiredate and employee ID for all rows in the emp table and deposits values into two separate PL/SQL tables. Notice that since we know there are just 14 rows in the emp table, only one call is needed to the EXECUTE_AND_FETCH function to fetch all rows.

CREATE OR REPLACE PROCEDURE showall
IS
cur INTEGER := DBMS_SQL.OPEN_CURSOR;
fdbk INTEGER;
empno_tab DBMS_SQL.NUMBER_TABLE;
hiredate_tab DBMS_SQL.DATE_TABLE;
BEGIN
DBMS_SQL.PARSE
(cur, 'SELECT empno, hiredate FROM emp', DBMS_SQL.NATIVE);
/* Allow fetching of up to 100 rows. */
DBMS_SQL.DEFINE_ARRAY (cur, 1, empno_tab, 100, 1);
DBMS_SQL.DEFINE_ARRAY (cur, 2, hiredate_tab, 100, 1);
fdbk := DBMS_SQL.EXECUTE_AND_FETCH (cur);
/* This will show total numbers of rows fetched. */
DBMS_OUTPUT.PUT_LINE (fdbk);

/* Get values for all rows in one call. */
DBMS_SQL.COLUMN_VALUE (cur, 1, empno_tab);
DBMS_SQL.COLUMN_VALUE (cur, 2, hiredate_tab);

FOR rowind IN empno_tab.FIRST .. empno_tab.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (empno_tab(rowind));
DBMS_OUTPUT.PUT_LINE (hiredate_tab(rowind));
END LOOP;

DBMS_SQL.CLOSE_CURSOR (cur);
END;
/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行