我创建了类型:
create or replace type t_rec_debts as table of t_rec_debt;
和
create or replace type t_rec_debt as Object(
ID_CON number(10),
V_NUMBER_CONTRACT varchar2(150),
V_LONG_TITLE nvarchar2(2000),
V_PRODUCT varchar2(32),
DT_BLOCK date ,
N_DAYS_TO_BLOCK number ,
N_PAY_SUM number ,
V_TEL_HOME varchar2(255) ,
V_TEL_WORK varchar2(255) ,
V_TEL_MOB varchar2(255) ,
V_EMAIL varchar2(255) ,
V_ADDRESS varchar2(255) ,
N_OBK varchar2(200)
);
然后我创建了这个集合:
t_data_forecast_debts t_rec_debts;
并填充它(检查它是否填充了痕迹)。
问题:如何将光标停在此集合上。在过程中我必须返回pdwr(sys_refcursor)。我尝试使用类似的东西:
open pdwr for
select MT.dt_block
from table(t_data_forecast_debts) MT;
但没有成功。
(Oracle版本11.2.0.4.0)。
感谢。
答案 0 :(得分:1)
这就是我要做的:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
SQL> set SERVEROUT ON;
SQL>
SQL> create or replace type t_rec_debt as Object(
2 ID_CON number(10),
3 V_NUMBER_CONTRACT varchar2(150),
4 V_LONG_TITLE nvarchar2(2000),
5 V_PRODUCT varchar2(32),
6 DT_BLOCK date ,
7 N_DAYS_TO_BLOCK number ,
8 N_PAY_SUM number ,
9 V_TEL_HOME varchar2(255) ,
10 V_TEL_WORK varchar2(255) ,
11 V_TEL_MOB varchar2(255) ,
12 V_EMAIL varchar2(255) ,
13 V_ADDRESS varchar2(255) ,
14 N_OBK varchar2(200)
15
16 );
17 /
Type created
SQL> create or replace type t_rec_debts as table of t_rec_debt;
2 /
Type created
SQL>
SQL> CREATE OR REPLACE PROCEDURE test_ref_cursor (p_ref_cur OUT SYS_REFCURSOR) AS
2 t_data_forecast_debts t_rec_debts := t_rec_debts();
3 BEGIN
4 t_data_forecast_debts.extend(1);
5 t_data_forecast_debts(1) := t_rec_debt (
6 1,
7 'TEST',
8 'V_LONG_TITLE',
9 'V_PRODUCT',
10 SYSDATE,
11 100,
12 200,
13 'V_TEL_HOME',
14 'V_TEL_WORK',
15 'V_TEL_MOB',
16 'V_EMAIL',
17 'V_ADDRESS' ,
18 'N_OBK');
19 OPEN p_ref_cur FOR SELECT * FROM TABLE(CAST(t_data_forecast_debts AS t_rec_debts));
20
21 END;
22 /
Procedure created
SQL>
SQL> DECLARE
2 l_ref_cur SYS_REFCURSOR;
3 id_con NUMBER(10);
4 v_number_contract VARCHAR2(150);
5 v_long_title NVARCHAR2(2000);
6 v_product VARCHAR2(32);
7 dt_block DATE;
8 n_days_to_block NUMBER;
9 n_pay_sum NUMBER;
10 v_tel_home VARCHAR2(255);
11 v_tel_work VARCHAR2(255);
12 v_tel_mob VARCHAR2(255);
13 v_email VARCHAR2(255);
14 v_address VARCHAR2(255);
15 n_obk VARCHAR2(200);
16
17 BEGIN
18 -- Call the procedure
19 test_ref_cursor(l_ref_cur);
20 FETCH l_ref_cur
21 INTO id_con,
22 v_number_contract,
23 v_long_title,
24 v_product,
25 dt_block,
26 n_days_to_block,
27 n_pay_sum,
28 v_tel_home,
29 v_tel_work,
30 v_tel_mob,
31 v_email,
32 v_address,
33 n_obk;
34
35 dbms_output.put_line(id_con);
36 dbms_output.put_line(v_number_contract);
37 dbms_output.put_line(v_long_title);
38 dbms_output.put_line(v_product);
39 dbms_output.put_line(dt_block);
40
41 END;
42 /
1
TEST
V_LONG_TITLE
V_PRODUCT
06-OCT-15
PL/SQL procedure successfully completed
请参阅打印的输出为1,即id_con
的值