精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 数据库技术>>Oracle产品>>Re:如何在oracle存储过程中返回查询结果集

主题:Re:如何在oracle存储过程中返回查询结果集
发信人: ljfling(plays)
整理人: tidycc(2001-02-11 22:11:37), 站内信件
【 在 cbd_xxj 的大作中提到:】
:请问如何在oracle编写一个存储过程用select语句查询
:一个结果集返回到调用它的程序中.
:多谢!
:......
 
create or replace package pkg_emp 
as
   type emptyp is record(
        empno  number(4),
        ename  varchar2(10),
        sal    number(7,2),
        deptno number(2));
   
   type v_emp_dept is ref cursor return emptyp;  ---據說這個類型可以讓前端(pb)接收得到,但我沒試過,你試試吧.

   type v_emp_job  is table of emptyp index by binary_integer;
end;

CREATE OR REPLACE PROCEDURE EM_PERLIST
       ( fact     IN VARCHAR,
         day      IN VARCHAR,
         day_type IN VARCHAR,
         brn_beg  IN VARCHAR,
         brn_end  IN VARCHAR,
         PER_CUR  IN OUT EM_PERPKG.PerCurTyp)
AS
     v_CursorID    INTEGER;
     v_Select      VARCHAR2(1000);
     v_Processed   INTEGER;
     v_SessionID   VARCHAR2(12) := dbms_session.unique_session_id;
     type_temp     CHAR(20);
     v_pnl_no      EM_PERWK.PNL_NO%TYPE;
BEGIN
     type_temp := 'WK_TYPE' || LTRIM(SUBSTR(day,7,2),'0');
     v_CursorID := dbms_sql.open_cursor;
     v_Select := 'SELECT EM_PERWK.PNL_NO FROM EM_PERWK,EM_PNL WHERE EM_PERWK.FACT_NO = EM_PNL.FACT_NO AND EM_PERWK.PNL_NO = EM_PNL.PNL_NO AND ' || 
                        'BRANCH_NO >= :a AND BRANCH_NO <= :b AND ' ||
'EM_PERWK.FACT_NO = :x AND CARD_YM = :y AND ' || type_temp || ' = :z';

dbms_sql.parse(v_CursorID,v_Select,dbms_sql.v7);
dbms_sql.bind_variable(v_CursorID,':a',brn_beg);
dbms_sql.bind_variable(v_CursorID,':b',brn_end);
dbms_sql.bind_variable(v_CursorID,':x',fact);
dbms_sql.bind_variable(v_CursorID,':y',SUBSTR(day,1,6));
dbms_sql.bind_variable(v_CursorID,':z',day_type);
dbms_sql.define_column(v_CursorID,1,v_pnl_no,8);

v_Processed := dbms_sql.execute(v_CursorID);

LOOP
IF dbms_sql.fetch_rows(v_CursorID) = 0 THEN
EXIT;
END IF;
dbms_sql.column_value(v_CursorID,1,v_pnl_no);
INSERT INTO EM_PERTMP VALUES (v_SessionID,day,day_type,fact,v_pnl_no);
END LOOP;
dbms_sql.close_cursor(v_CursorID);

OPEN PER_CUR FOR
SELECT CARD_D,TYPE,EM_PNL.FACT_NO,FACT_NM,EM_PNL.PNL_NO,PNL_NM,EM_PNL.BRANCH_NO,BRANCH_NM
FROM EM_PNL,EM_FACT,EM_BRANCH,EM_PERTMP
WHERE EM_PERTMP.SESSION_ID = v_SessionID AND
EM_PERTMP.FACT_NO = EM_PNL.FACT_NO AND
EM_PERTMP.PNL_NO = EM_PNL.PNL_NO AND
EM_PNL.FACT_NO = EM_FACT.FACT_NO AND
EM_PNL.BRANCH_NO = EM_BRANCH.BRANCH_NO;

DELETE EM_PERTMP WHERE SESSION_ID = v_SessionID;
COMMIT;

EXCEPTION
WHEN OTHERS THEN
dbms_sql.close_cursor(v_CursorID);
RAISE;
END EM_PERLIST;




----
            .-""""-.        .-""""-.
           /        \      /        \
          /_        _\    /_        _\
         // \      / \\  // \      / \\
         |\__\    /__/|  |\__\    /__/|
          \    ||    /    \    ||    /
           \        /      \        /
            \  __  /        \  __  /
             '.__.'          '.__.'
              |  |  克隆时代  |  |
              |  |            |  |

   

[关闭][返回]