Oracle连接流水线数据的问题



我试图设置一个测试用例,它调用一个基于DATE范围返回日期的流水线函数。我的目标是每个日期都有一行。

当我试图创建过程时,我得到以下错误(见下文)。我知道我必须将传递的p_id与从函数返回的结果连接起来,但我似乎无法弄清楚,因为没有链接将它们连接起来。

有人能提供正确的代码来解决这个问题,并解释我做错了什么。提前感谢所有回答问题的人以及你们的专业知识。

错误:PROCEDURE CREATE_DATALine/Col: 8/10 PL/SQL: SQL语句被忽略Line/Col: 11/13 PL/SQL: ORA-00936: missing expression

CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;
CREATE OR REPLACE FUNCTION generate_dates_pipelined(
p_from IN DATE,
p_to   IN DATE
)
RETURN nt_date  PIPELINED   DETERMINISTIC
IS
v_start DATE := TRUNC(LEAST(p_from, p_to));
v_end   DATE := TRUNC(GREATEST(p_from, p_to));
BEGIN
LOOP
PIPE ROW (v_start);
EXIT WHEN v_start >= v_end;
v_start := v_start + INTERVAL '1' DAY;
END LOOP;
RETURN;
END       generate_dates_pipelined;
CREATE TABLE data(
d_id NUMBER(6),
d_date DATE
);
CREATE OR REPLACE PROCEDURE create_data (
p_id IN NUMBER,
p_start_date  IN DATE,
p_end_date   IN DATE
)
IS
BEGIN
INSERT INTO data (d_id, d_date) 
VALUES 
(p_id, 
TABLE(        generate_dates_pipelined(p_start_date, p_end_date)
) c
);
END;
EXEC create_data (1, DATE '2021-08-21', DATE '2021-08-30');

您的表期望每行有一个DATE;您正在尝试为每行提供日期集合。

您需要为集合的每一行设置INSERT,并且可以使用SELECT语句:

CREATE OR REPLACE PROCEDURE create_data (
p_id IN NUMBER,
p_start_date  IN DATE,
p_end_date   IN DATE
)
IS
BEGIN
INSERT INTO data (d_id, d_date) 
SELECT p_id,
COLUMN_VALUE
FROM   TABLE(generate_dates_pipelined(p_start_date, p_end_date));
END;
/

最新更新