两个表,两个types 如下:create table HL002
(
ID VARCHAR2(2),
NAME VARCHAR2(10),
TIME Date
);CREATE TABLE HL003
(
RECORD_ID VARCHAR2(2),
RECORD_NAME VARCHAR(10),
ID VARCHAR(2) --与表HL002关联
);create or replace type HL003_TYP_LIST AS TABLE OF HL003_TYP_OBJ;create or replace type HL003_TYP_OBJ as object
(
RECORD_ID varchar(2),
RECORD_NAME varchar(10),
ID VARCHAR(2)
);create or replace type HL002_TYP_LIST AS TABLE OF HL002_TYP_OBJ;create or replace type HL002_TYP_OBJ as object
(
ID varchar(2),
NAME varchar(10),
TYP_LIST HL003_TYP_LIST
);想写个存储过程,实现按时间查询,并输出types类型的结果CREATE OR REPLACE PACKAGE BODY PRC_TEST001 AS
PROCEDURE TEST001(BEGINDATE IN VARCHAR2,
ENDDATE IN VARCHAR2,
V_TYP_002_LIST OUT HL002_TYP_LIST) AS
V_TYP_003_LIST HL003_TYP_LIST;
BEGIN
--获取 V_TYP_003_LIST
SELECT HL003_TYP_OBJ(B.RECORD_ID, B.RECORD_NAME, B.ID) BULK COLLECT
INTO V_TYP_003_LIST
FROM HL003 B, HL002 A
WHERE A.ID = B.ID;
--获取 V_TYP_002_LIST
SELECT HL002_TYP_OBJ(A.ID, A.NAME, V_TYP_003_LIST) BULK COLLECT
INTO V_TYP_002_LIST
FROM HL002 A
WHERE A.RECORD_TIME >= BEGINDATE
AND A.RECORD_TIME < ENDDATE;
END TEST001;
END PRC_TEST001;请问
1、我如何对输入的时间参数做判断,比如判断是否为空,因为是作为where条件的
2、在获取第二个输出的时候,其中的V_TYP_003_LIST怎样和HL002 表关联!?
(
ID VARCHAR2(2),
NAME VARCHAR2(10),
TIME Date
);CREATE TABLE HL003
(
RECORD_ID VARCHAR2(2),
RECORD_NAME VARCHAR(10),
ID VARCHAR(2) --与表HL002关联
);create or replace type HL003_TYP_LIST AS TABLE OF HL003_TYP_OBJ;create or replace type HL003_TYP_OBJ as object
(
RECORD_ID varchar(2),
RECORD_NAME varchar(10),
ID VARCHAR(2)
);create or replace type HL002_TYP_LIST AS TABLE OF HL002_TYP_OBJ;create or replace type HL002_TYP_OBJ as object
(
ID varchar(2),
NAME varchar(10),
TYP_LIST HL003_TYP_LIST
);想写个存储过程,实现按时间查询,并输出types类型的结果CREATE OR REPLACE PACKAGE BODY PRC_TEST001 AS
PROCEDURE TEST001(BEGINDATE IN VARCHAR2,
ENDDATE IN VARCHAR2,
V_TYP_002_LIST OUT HL002_TYP_LIST) AS
V_TYP_003_LIST HL003_TYP_LIST;
BEGIN
--获取 V_TYP_003_LIST
SELECT HL003_TYP_OBJ(B.RECORD_ID, B.RECORD_NAME, B.ID) BULK COLLECT
INTO V_TYP_003_LIST
FROM HL003 B, HL002 A
WHERE A.ID = B.ID;
--获取 V_TYP_002_LIST
SELECT HL002_TYP_OBJ(A.ID, A.NAME, V_TYP_003_LIST) BULK COLLECT
INTO V_TYP_002_LIST
FROM HL002 A
WHERE A.RECORD_TIME >= BEGINDATE
AND A.RECORD_TIME < ENDDATE;
END TEST001;
END PRC_TEST001;请问
1、我如何对输入的时间参数做判断,比如判断是否为空,因为是作为where条件的
2、在获取第二个输出的时候,其中的V_TYP_003_LIST怎样和HL002 表关联!?
没明白什么意思。
FROM HL002 A
WHERE 1=1 ';
IF BEGINDATE IS NOT NULL THEN
v_sql := v_sql || ' and to_char(time,yyyy-mm-dd) >= '''||begindate||'''';
END IF
open v_cursor for v_sql;
fetch v_cursor BULK COLLECT
INTO V_TYP_002_LIST;这样的话,红色部分是由上一句取得的hl002的记录集,在当前独立语句中不认,而且也不能作为作为字符串类型拼接!
所以不知道这么写了!!
------------------
问题2补充:
第二句中的 V_TYP_003_LIST 是由上句取得的记录集,应该是满足关联的全部数据,加到当前句中 作为一个变量,里面的数据例如
record_id,record_name,id
1 记录1 1
2 记录2 1
3 记录3 2
4 记录4 2
而 第二句 根据where 条件 查询结果 为:
id name V_TYP_003_LIST
1 名字1 record_id,record_name,id
1 记录1 1
2 记录2 1
3 记录3 2
4 记录4 2
2 名字2 record_id,record_name,id
1 记录1 1
2 记录2 1
3 记录3 2
4 记录4 2
意思就是说 V_TYP_003_LIST 中的记录如何与外面的对应上!
其实就是 查询 两个表的关联数据,只不过返回类型定义的比较恶心!type 里面还嵌套了一个type