发信人: 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;
---- .-""""-. .-""""-.
/ \ / \
/_ _\ /_ _\
// \ / \\ // \ / \\
|\__\ /__/| |\__\ /__/|
\ || / \ || /
\ / \ /
\ __ / \ __ /
'.__.' '.__.'
| | 克隆时代 | |
| | | |
|
|