Oracle 问题加入流水线数据
Oracle issue joining pipelined data
我正在尝试设置一个测试 CASE,它调用一个流水线函数,returns 根据 DATE 范围确定日期。我的目标是每个日期都有一行。
我在尝试创建过程时遇到以下错误(见下文)。我知道我必须加入传入的 p_id 和函数返回的结果,但我似乎无法弄清楚如何,因为没有 link 来加入它们。
有人可以提供正确的代码来解决这个问题并解释我做错了什么。预先感谢所有回答者和您的专业知识。
错误:程序CREATE_DATA
Line/Col:8/10 PL/SQL:SQL 声明被忽略
Line/Col: 11/13 PL/SQL: ORA-00936: 缺少表达式
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');
您的 table 每行需要一个 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;
/
我正在尝试设置一个测试 CASE,它调用一个流水线函数,returns 根据 DATE 范围确定日期。我的目标是每个日期都有一行。
我在尝试创建过程时遇到以下错误(见下文)。我知道我必须加入传入的 p_id 和函数返回的结果,但我似乎无法弄清楚如何,因为没有 link 来加入它们。
有人可以提供正确的代码来解决这个问题并解释我做错了什么。预先感谢所有回答者和您的专业知识。
错误:程序CREATE_DATA Line/Col:8/10 PL/SQL:SQL 声明被忽略 Line/Col: 11/13 PL/SQL: ORA-00936: 缺少表达式
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');
您的 table 每行需要一个 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;
/